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; } };
暂时没看懂交叉归并这部分