要求:前面一个大于后面一个算逆序
思路:暴力超时,树状数组线段树不会,用归并,合并数组时,左边数组大于右边的话,逆序就加上左边剩余的长度
class Solution {
public:
int cnt=0;
int reversePairs(vector<int>& nums) {
mergeSort(0,nums.size()-1,nums);
return cnt;
}
void mergeSort(int left,int right,vector<int>& nums){
if(left>=right)return;
int mid=left+(right-left>>1);
mergeSort(left,mid,nums);
mergeSort(mid+1,right,nums);
merge(left,mid,right,nums);
}
void merge(int left,int mid,int right,vector<int>& nums){
vector<int> tmp(right-left+1);
int index=0;
int i=left,j=mid+1;
while(i<=mid&&j<=right){
if(nums[i]>nums[j]){
cnt+=mid-i+1;
tmp[index++]=nums[j++];
}
else tmp[index++]=nums[i++];
}
while(i<=mid)tmp[index++]=nums[i++];
while(j<=right)tmp[index++]=nums[j++];
for(int i=0;i<tmp.size();++i)
nums[i+left]=tmp[i];
}
};