题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
#include <vector>
class Solution {
public:
int mod = 1000000007;
int InversePairs(vector<int>& nums) {
//
int n = nums.size();
vector<int> temp(n);
int ret = 0;
merge_sort(nums, 0, n - 1, temp, ret); //这里记住temp一定得是引用类型的,不然超出内存
return ret;
}
void merge_sort(vector<int>& nums, int left, int right, vector<int>& temp, int & ret){
if(left >= right) return;//当只有一个元素的时候进行返回
int mid = left + ((right - left)>>1);
merge_sort(nums, left, mid, temp, ret);
merge_sort(nums, mid + 1, right, temp, ret);
merge_(nums, left, mid, right, temp, ret); //此时进行合并,两个集合之间进行计算有多少逆序数
}
void merge_(vector<int> & nums, int left, int mid, int right, vector<int> &temp, int & ret){
int i = left, j = mid + 1, k = 0;
while(i <= mid && j <= right){
if(nums[i] >nums[j]){
temp[k++] = nums[j++];
ret += (mid - i + 1); //只有当i指向的元素大于j指向的元素才计算逆序对,同时将temp中的元素进行更新,temp存储的是有序的
ret %= mod;
}
else{
temp[k++] = nums[i++];
}
}
//下面两个while用来处理i或j已经到达终点的情况,而另外一个(i或j) 还没有完全更新至temp中
while(i <= mid) temp[k++] = nums[i++];
while(j <= right) temp[k++] = nums[j++];
for(k = 0, i = left; i <= right; ++i, ++k){
nums[i] = temp[k]; //更新left到right下标中的元素,局部有序
}
}
};

