class Solution {
const int MOD = 1000000007;
int count = 0;
void mergeSort(vector<int>& nums, int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);//对交叉归并的理解更加重要
}
void merge(vector<int>& nums, int left, int mid, int right) {
vector<int> temp(right - left + 1);
//先定义一个临时数组
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
// 当nums[i] > nums[j]时,nums[i...mid]都会比nums[j]大
count = (count + mid - i + 1) % MOD;
temp[k++] = nums[j++];
}
}
//遍历,不进行排序
while (i <= mid) temp[k++] = nums[i++];
while (j <= right) temp[k++] = nums[j++];
for (int p = 0; p < temp.size(); p++) {
nums[left + p] = temp[p];
}
}
public:
int InversePairs(vector<int>& nums) {
if (nums.empty()) return 0;
mergeSort(nums, 0, nums.size() - 1);
return count;
}
};
暂时没看懂交叉归并这部分

京公网安备 11010502036488号