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

数组中的逆序对

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

归并排序的时间复杂度

全部评论

相关推荐

11-11 17:45
门头沟学院 Java
扶老蟑螂过马路被无证...:1. 技术栈那里把数据结构删了,小中厂用不上,大厂手撕能难死你,linux那里可以考虑删掉,还不如换个git团队协作开发 2.不要使用一些项目不匹配的技术,例如分库分表和你上边的ddd,真正使用ddd的都是【超】大规模,大部分都仍然使用多模块聚合mvc,这样虽然看起来高大上,但是新增了前期协定需求跟后期维护的成本,因为开发中都是选择最适合当起版本的开发方式跟中间件,这样反而会体现你为了学而学(因为可能面试官都不完全熟悉ddd,然后问你你也回答不出深度) 3.项目写了很多的redis使用,为什么技术栈不写上redis 4.项目技术栈跟业务需求高度重合,完全可以整合成一个,然后再去弄一个感兴趣的其他业务或者轮子,或者把上面的一个换下包装 5.奖项自己编一点奖学金,加个四六级,删掉蓝桥杯
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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