题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
#include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ const int MOD = 1000000007; long long invCount = 0; int InversePairs(vector<int>& nums) { if (nums.size() < 2) return 0; invCount = 0; mergeSort(nums, 0, nums.size() - 1); return invCount; } void merge(vector<int>& nums, int left, int mid, int right) { //分配左右数组的大小 int leftSize = mid - left + 1; int rightSize = right - mid; //声明两个临时数组来存储左边和右边元素 vector<int> leftArr(leftSize); vector<int> rightArr(rightSize); //拷贝元素到临时数组 for (int i = 0; i < leftSize; ++i) { leftArr[i] = nums[left + i]; } for (int j = 0; j < rightSize; ++j) { rightArr[j] = nums[mid + 1 + j]; } //合并临时数组到原数组 int i = 0, j = 0, k = left; while (i < leftSize && j < rightSize) { if (leftArr[i] <= rightArr[j]) { nums[k] = leftArr[i]; i++; } else { nums[k] = rightArr[j]; j++; invCount += (leftSize - i); invCount %= MOD; } k++; } //合并剩余的元素 while (i < leftSize) { nums[k] = leftArr[i]; i++; k++; } while (j < rightSize) { nums[k] = rightArr[j]; j++; k++; } } void mergeSort(vector<int>& nums, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } } };