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

数组中的逆序对

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;  // 防止溢出
    }
};

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

数据结构练习

全部评论

相关推荐

点赞 评论 收藏
分享
孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务