关键在于合并的过程中怎么求解逆序对的数量,合并过程中需要将乱序的[left,mid]和[mid+1,right]元素排好序,
此时[left,mid]和[mid+1,right]均排好序的情况下,那么如果num[idx1]>num[idx2]代表[idx1,mid]之间的
所有元素都>num[idx2],跟num[idx2]组合都是逆序对,此时求解出来的逆序对数量是 mid-idx1+1
而因为[left,mid]和[mid+1,right]还并未合并,所以前后两组元素顺序并未改变,这样算法仍是正确的
class Solution {
int res=0;
public int reversePairs(int[] nums) {
mersort(nums,0,nums.length-1);
return res;
}
public void mersort(int []nums,int left,int right){
if(left>=right)return ;
int mid=(left+right)/2;
mersort(nums,left,mid);
mersort(nums,mid+1,right);
merge(nums,left,right,mid);
}
public void merge(int []nums,int left,int right,int mid){
int []temp=new int[right-left+1];
int idx1=left,idx2=mid+1,idx=0;
while(idx1<=mid&&idx2<=right){
if(nums[idx1]>nums[idx2]){
res+=mid+1-idx1;
temp[idx++]=nums[idx2++];
}
else{
temp[idx++]=nums[idx1++];
}
}
while(idx1<=mid){
temp[idx++]=nums[idx1++];
}
while(idx2<=right){
temp[idx++]=nums[idx2++];
}
for (int t = 0 ; t < temp.length;t++){
nums[left+t] = temp[t];
}
}
}