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

数组中的逆序对

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

归并排序

归并排序进行merge时,左右两个区间均是有序的,当选择右边区间元素时,左边区间的每个元素都比当前选择元素大,即有mid - i + 1个逆序对。所以我们可以在归并排序的过程中顺便求出逆序对。

C++代码:

class Solution {
private:
    int cnt;
    vector<int> a, b;
public:
    int InversePairs(vector<int> data) {
        a = b = data;
        cnt = 0;
        mergeSort(0, a.size() - 1);
        return cnt;
    }
    void mergeSort(int l, int r) {
        if (l >= r) return;
        
        int mid = (l + r) / 2, i = l, j = mid + 1;
        mergeSort(l, mid);
        mergeSort(mid + 1, r);
        
        for (int k = l; k <= r; k++) {
            if (j > r || (i <= mid && a[i] < a[j])) {
                b[k] = a[i++];
            } else {
                b[k] = a[j++];
                cnt += mid - i + 1;
                cnt %= 1000000007;
            }
        }
        
        for (int k = l; k <= r; k++) {
            a[k] = b[k];
        }
    }
};

时间复杂度:O(NlogN)

空间复杂度:O(N)

全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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