在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int reversePairs(int[] nums) {
int len = nums.length;
if(nums==null||len<2){
return 0;
}
int[] help= new int [len];
return mergeSort(nums,0,len-1,help);
}
public int mergeSort(int[] arr,int left,int right,int[] help){
if(left==right){
return 0;
}
int mid = left+(right-left)/2;
int p1 = mergeSort(arr,left,mid,help);
int p2 = mergeSort(arr,mid+1,right,help);
int p3 = merge(arr,left,mid,right,help);
return (p1+p2+p3);
}
public int merge(int[] arr,int left,int mid,int right,int[] help){
int l = left;
int r = mid+1;
int count = 0;
int i = 0;
while(l<=mid&&r<=right){
if(arr[l]<=arr[r]){
help[i++] = arr[l++];
}else{
//arr[l]比arr[r]大,他们可以构成逆序对了,
//而且左边的数是有序的,所以剩下的数也可以与arr[r]构成逆序对,共计mid-l+1个
help[i++] = arr[r++];
count = count+mid-l+1;
}
}
while(l<=mid){
help[i++] = arr[l++];
}
while(r<=right){
help[i++] = arr[r++];
}
for( i = 0;i<right-left+1;i++){
arr[left+i] = help[i];
}
return count;
}
}