具体思路:
逆序对最常采用的方式就是归并问题;
自己想了一下单调递减队列一级最长递增序列,全部在n方以上复杂度;
总的来说,如果分为两块,对两块分别排序,并不影响逆序对数,并且相同一块的逆序对在递归中可以计算;
左半边为i,右半边为j;
如果j小于i,则说明i以后的元素全部小于j,因此直接计算i~mid的个数即可;
具体代码:
class Solution {
public:
int reversePairs(vector<int>& nums) {
int cnt=0;
int n=nums.size();
vector<int> tmp(n,0);
meregesort(nums, cnt, 0, nums.size()-1);
return cnt;
}
void meregesort(vector<int>& nums,int& cnt,int l,int r){
if(l>=r)
return;
int mid=l+(r-l)/2;
meregesort(nums, cnt, l, mid);
meregesort(nums, cnt, mid+1, r);
vector<int>temp(r-l+1);
int index=0;
int left=l;
int p=mid+1;
while(l<=mid&&p<=r){
if(nums[l]<=nums[p]){
temp[index++]=nums[l++];
}else{
cnt+=mid-l+1;
temp[index++]=nums[p++];
}
}
while(l<=mid){
temp[index++]=nums[l++];
}
while(p<=r){
temp[index++]=nums[p++];
}
copy(temp.begin(), temp.end(), nums.begin()+left);
}
};