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

数组中的逆序对

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

class Solution {
  public:
    const int MOD = 1000000007;

// 归并排序中的合并函数,同时计算逆序对数量
    int merge(vector<int>& nums, int left, int mid, int right, vector<int>& temp) {
        int i = left;    // 左子数组的起始位置
        int j = mid + 1; // 右子数组的起始位置
        int k = 0;       // 临时数组的索引
        int inv_count = 0; // 逆序对数量

        // 合并两个有序数组,并计算逆序对
        while (i <= mid && j <= right) {
            if (nums[i] <= nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
                inv_count += (mid - i +
                              1); // nums[i]到nums[mid]都比nums[j]大,形成逆序对
            }
        }

        // 将剩余元素添加到临时数组
        while (i <= mid) {
            temp[k++] = nums[i++];
        }
        while (j <= right) {
            temp[k++] = nums[j++];
        }

        // 将排序后的数组复制回原数组
        for (i = 0; i < k; i++) {
            nums[left + i] = temp[i];
        }

        return inv_count % MOD; // 防止溢出
    }

// 归并排序函数,同时计算逆序对
    int mergeSort(vector<int>& nums, int left, int right, vector<int>& temp) {
        int inv_count = 0;
        if (left < right) {
            int mid = left + (right - left) / 2;
            inv_count += mergeSort(nums, left, mid, temp);  // 排序左半部分
            inv_count += mergeSort(nums, mid + 1, right, temp); // 排序右半部分
            inv_count += merge(nums, left, mid, right, temp); // 合并并计算逆序对
        }
        return inv_count % MOD;
    }

    int InversePairs(vector<int>& nums) {
        int n = nums.size();
        vector<int> temp(n); // 临时数组,用于归并排序
        return mergeSort(nums, 0, n - 1, temp) % MOD;  // 防止溢出
    }
};

数据结构练习 文章被收录于专栏

数据结构练习

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:30
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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