题解 | #数组中的逆序对#
数组中的逆序对
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; // 防止溢出 } };
数据结构练习 文章被收录于专栏
数据结构练习