剑指 Offer 51 数组中的逆序对(C++)

题目链接:

剑指 Offer 51 数组中的逆序对

 

题解:

class Solution {
public:
    int reversePairs(vector& nums) 
    {
        vector temp(nums.size());
        return mergeSort(0, nums.size() - 1, nums, temp);
    }

private:
    int mergeSort(int l, int r, vector &nums, vector &temp) // 多传一个引用参数可以减少内存的使用
    {
        if(l >= r)
            return 0;
        int m = (l + r) / 2;
        int res = mergeSort(l, m, nums, temp) + mergeSort(m + 1, r, nums, temp);
        for(int k = l; k <= r; ++k)
            temp[k] = nums[k];
        int i = l, j = m + 1; // i, j分别指向左右两数组当前元素
        for(int k = l; k <= r; ++k)
        {
            if(i == m + 1) // 左边的数组已经合并完,将右边的数组剩余部分合并
                nums[k] = temp[j++];
            else if(j == r + 1 || temp[i] <= temp[j]) // 右边的数组已经合并完或者左小于右,将左数组当前元素合并
                nums[k] = temp[i++];
            else // 左数组当前元素大于右数组当前元素
            {
                nums[k] = temp[j++];
                res += m - i + 1; // 左数组当前元素及后面的元素都可以构成逆序对
            }
        }
        return res;
    }
};

 

解题思路:

利用归并排序的过程求解,具体讲解还是直接看K神的吧

你可能感兴趣的:(剑指 Offer 51 数组中的逆序对(C++))