题解 | 数组中的逆序对

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

class Solution {
  public:
  //利用归并排序进行逆序对的计数
  //容易错误之处:用于比较的临时数组temp应当在递归函数内建立,而不是传一个临时数组的引用到函数内。这样能每次递归都使子函数有序,用排列好的子数组计算逆序对才有意义,否则res+=mid-i+1计算逆序对的方法就是错误的(因为这种计算方法是基于有序子数组)
    int mod=int(1e9+7);
    int InversePairs(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        vector <int> temp(nums.size());
        return MergeSort(left, right, nums, temp);
    }
    int MergeSort(int left, int right, vector <int>& data, vector <int>& temp) {
        if (left >= right)return 0;
        int mid = left + ((right - left) >> 1);
        int res = MergeSort(left, mid, data, temp) + MergeSort(mid + 1, right, data,temp);
        res%=mod;
        for (int k = left; k <= right; k++) temp[k] = data[k];
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++) {
            if (i == mid + 1)data[k] = temp[j++];
            else if (j == right + 1 || temp[i] <= temp[j]) data[k] = temp[i++];
            else {
                res += mid - i + 1, data[k] = temp[j++];
            }
        }
        return res%mod;

    }
};

#转行#
全部评论
点赞 回复 分享
发布于 05-06 21:24 广东

相关推荐

做黑夜里的那道光:两年电赛完赛没必要写,纯扣分
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务