https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
class Solution {
public int reversePairs(int[] nums) {
int len=nums.length;
//长度0或1,无逆序对,直接返回0
if(len<2){
return 0;
}
int[] temp=new int[len];//临时数组
int[] copy=new int[len];
for(int i=0;i<len;i++){
copy[i]=nums[i];
}
return reversePairs(copy,0,len-1,temp);
}
private int reversePairs(int[] nums,int left,int right,int[] temp){
//终止条件
if(left==right){
return 0;
}
//这样计算Mid 防止整型溢出
int mid=left+(right-left)/2;
//左边归并排序并计数
int leftCount=reversePairs(nums,left,mid,temp);
//右边归并排序并计数
int rightCount=reversePairs(nums,mid+1,right,temp);
//如果已经有序,无需再排序
if(nums[mid]<=nums[mid+1]){
return leftCount+rightCount;
}
//对有序的左边和右边一起进行归并排序
int reverseCount=mergeCount(nums,left,mid,right,temp);
return leftCount+rightCount+reverseCount;
}
private int mergeCount(int[] nums,int left,int mid,int right,int[] temp){
for(int i=left;i<=right;i++){
temp[i]=nums[i];
}
int i=left;
int j=mid+1;
int count=0;
for(int k=left;k<=right;k++){
//左边为空
if(i==mid+1){
nums[k]=temp[j];
j++;
}
//右边为空
else if(j==right+1){
nums[k]=temp[i];
i++;
}
else if(temp[i]<=temp[j]){
nums[k]=temp[i];
i++;
}
else{
//temp[j]<temp[i]时,count+=左半边现有数目
nums[k]=temp[j];
count+=(mid-i+1);
j++;
}
}
return count;
}
}
时间复杂度O(nlogn) 空间复杂度O(N)