剑指 Offer 51. 数组中的逆序对 力扣(困难) 巧用归并排序算法

剑指 Offer 51. 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

 

示例 1:

输入: [7,5,6,4]
输出: 5

题解:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/

代码:

class Solution {
public:
    int a[50005];
    int res=0;
    void merge(vector<int>& nums,int l,int mid, int r)  // 这里必须加上取地址符号!!!!
    {
        int i=l;
        int j=mid+1;
        int pos=l;
        while(i<=mid && j<=r)
        {
            if(nums[i]<=nums[j]) 
            {
                a[pos++]=nums[i++];
                //res+=(j-(mid+1));  // 如果选择从左边计算,后面还需要加上
            }
             else  
             {
                 a[pos++]=nums[j++];
                 res+=(mid-i+1);   // 选择右边计算就不用加,因为不存在逆序对了
             }
        }
        
         while(i<=mid)
         {
           a[pos++]=nums[i++];
             // res+=(j-(mid+1));
         }
                
        while(j<=r) a[pos++]=nums[j++];
        
        for(int i=l;i<=r;i++) nums[i]=a[i];
        return;
    }
    void split(vector<int>& nums, int l,int r)  // 这里必须加上取地址符号!!!!
    {
        if(l>=r) return;
        int mid=l+(r-l)/2;
        // int mid=(l+r)/2;  //  这两句都可以。
        split(nums,l,mid);
        split(nums,mid+1,r);
        merge(nums,l,mid,r);
        //return;
    }
    int reversePairs(vector<int>& nums) {
        
        split(nums,0,nums.size()-1);
        return res;   
    }
};

 

posted on 2021-11-17 13:06  Yxter  阅读(32)  评论(0编辑  收藏  举报

导航