题解 | #数组中的逆序对#

数组中的逆序对

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

typedef long long LL; 
#define mod 1000000007;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
     // 对数组进行归并排序
     // 排序的过程中记录逆序对的数量
    LL merge_sort(vector<int>& nums, LL l, LL r){
        if(l >= r) return 0; // 结束标志
        LL res = 0;
        LL mid = l + r >> 1;  // mid位置
        // 先对两边的进行排序
        res =  merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);

        vector<int> tmp; // 临时数组
        int i = l,j = mid+1;
        while( i<=mid && j <= r){  // 可以等
            if(nums[i] <= nums[j]) {
                tmp.push_back(nums[i]);
                i++;
            }
            else {
                tmp.push_back(nums[j]);
                j++;
                res += mid - i + 1; // mid和i之间的都构成逆序
            }
        }

        while(i <= mid) tmp.push_back(nums[i++]);
        while(j <= r) tmp.push_back(nums[j++]);

        for(int i=l, j=0; i<=r; i++, j++)  nums[i] = tmp[j];

        return res % mod;

    }

    int InversePairs(vector<int>& nums) {
        // write code here
        int n = nums.size();

        LL ans = merge_sort(nums, 0, nums.size()-1);
        
        return ans;
    }
};

解题思路:

使用归并排序记录逆序对,注意每次结果加的数量

注意:排序结束的标志,结果的范围,以及最后要取模

时间复杂度:

nlogn

归并排序的时间复杂度

全部评论

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务