class Solution { public: //利用归并排序进行逆序对的计数 //容易错误之处:用于比较的临时数组temp应当在递归函数内建立,而不是传一个临时数组的引用到函数内。这样能每次递归都使子函数有序,用排列好的子数组计算逆序对才有意义,否则res+=mid-i+1计算逆序对的方法就是错误的(因为这种计算方法是基于有序子数组) int mod=int(1e9+7); int InversePairs(vector<int>& nums) { int left = 0; int right = nums.size() - 1; vector <int> temp(nums.size()); return MergeSort(left, right, nums, temp); } int MergeSort(int left, int right, vector <int>& data, vector <int>& temp) { if (left >= right)return 0; int mid = left + ((right - left) >> 1); int res = MergeSort(left, mid, data, temp) + MergeSort(mid + 1, right, data,temp); res%=mod; for (int k = left; k <= right; k++) temp[k] = data[k]; int i = left, j = mid + 1; for (int k = left; k <= right; k++) { if (i == mid + 1)data[k] = temp[j++]; else if (j == right + 1 || temp[i] <= temp[j]) data[k] = temp[i++]; else { res += mid - i + 1, data[k] = temp[j++]; } } return res%mod; } };