Leetcode--数组中的逆序对

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

 

示例 1:

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

限制:

0 <= 数组长度 <= 50000

思路

参考了官方题解Leetcode题解中的归并法;

通过计算右数组中数值比左数组小的个数来计算逆序对

class Solution {
public:
    vector temp;
    int mergeSort(vector& nums, int l, int r){
        if(l>= r) return 0;

        int mid= l+ (r- l)/ 2;
        int result= mergeSort(nums, l, mid)+ mergeSort(nums, mid+ 1, r);
        // 拷贝数组
        for(int i= l; i<= r; ++i)
            temp[i]= nums[i];

        // 归并两个子数组
        int i= l, j= mid+ 1, pos= l;
        while(i<= mid&& j<= r){
            if(temp[i]<= temp[j]){
                nums[pos++]= temp[i++];
                // 计算逆序数
                result+= j- (mid+ 1);
            }
            else{
                nums[pos++]= temp[j++];
            }
        }
        // 左数组还没遍历完
        while(i<= mid){
            nums[pos++]= temp[i++];
            result+= j- (mid+ 1);
        }
        // 右数组还没遍历完
        while(j<= r)
            nums[pos++]= temp[j++];
        return result;
    }
    int reversePairs(vector& nums) {
        temp= nums;
        return mergeSort(nums, 0, nums.size()- 1);
    }   
};

 

你可能感兴趣的:(leetcode)