class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ long long ans=0; long long md=1000000007; int InversePairs(vector<int>& nums) { // write code here mergeSort(nums, 0, nums.size() - 1); return ans; } // 合并两个有序数组 void merge(std::vector<int>& arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 std::vector<int> L(n1), R(n2); // 拷贝数据到临时数组 for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 合并临时数组回原数组 int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; ans+=(mid-(left+i)+1);//如果L[i]小于R[j]说明,有【右边-左边】+1对数逆序 ans%=md; j++; } k++; } // 拷贝L剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } // 拷贝R剩余元素 while (j < n2) { arr[k] = R[j]; j++; k++; } } // 归并排序主函数 void mergeSort(std::vector<int>& arr, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 递归排序左右两部分 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并已排序的两部分 merge(arr, left, mid, right); } } };