class Solution {
int[] nums, tmp;
public int reversePairs(int[] nums) {
this.nums = nums;
tmp=new int[nums.length];
return mergeSort(0,nums.length-1);
}
private int mergeSort(int l,int r){
if(l>=r) return 0;
int m=(l+r)>>1;
int res=mergeSort(l,m)+mergeSort(m+1,r);
//合并
int i=l,j=m+1;
for(int k=l;k<=r;k++){
tmp[k]=nums[k];
}
for(int k=l;k<=r;k++){
if(i==m+1){//左子树合并完成,添加右子树当前元素tmp[j++]
nums[k]=tmp[j++];
}
else if(j==r+1||tmp[i]<=tmp[j]){//代表右子数组已合并完,因此添加左子数组当前元素 tmp[i++]||不是逆序对
nums[k]=tmp[i++];
}
else{
nums[k]=tmp[j++];
res+=(m-i+1);
}
}
return res;
}
}
10-14
394
08-18
1430
02-09
2213
11-22
4万+