class Solution {
public:
/**
一个数比后面的某一个数大则就是一个逆序对,计数就加1;
暴力检测每个数N^2,利用分治算法,从下往上时,计数同时进行排序原数组,因为数组有序减少了比较时间
*/
int count = 0;
int const mod = 1000000007;
int InversePairs(vector<int>& nums) {
int n = nums.size();
if(n<2)return 0;
dp(nums, 0, nums.size()-1);
return count;
}
void dp(vector<int>& nums, int left, int right){
if(left >= right) return;
int mid = left + (right-left)/2;
dp(nums, left, mid);
dp(nums, mid+1, right); //两边排好了序
vector<int> temp;
int l_vec=left, r_vec=mid+1; //进行检测,并排序
while(l_vec <= mid && r_vec <=right){
if(nums[l_vec] > nums[r_vec]){ //当前是逆序对
count += mid - l_vec + 1;
count %= mod;
temp.push_back(nums[r_vec]); //把小的放入,进行排序
r_vec++;
}else{ //当前不是逆序对
temp.push_back(nums[l_vec]);
l_vec++;
}
}
while(l_vec <=mid){ //如果左数组剩余
temp.push_back(nums[l_vec] );
l_vec++;
}
while(r_vec <= right){
temp.push_back(nums[r_vec]);
r_vec++;
}
int index = left;
//排好序之后改变其原来的数组
for(int num:temp){
nums[index] = num;
index++;
}
}
};