数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
- 0 <= 数组长度 <= 50000
解法:归并排序
排序链表
class Solution {
int ans=0;
int[] tmp;
public int reversePairs(int[] nums) {
int n=nums.length;
tmp=new int[n];
mergeSort(nums,0,n-1);
return ans;
}
public void mergeSort(int[] nums,int l,int r){
if(l>=r) return;
int mid=l+(r-l)/2;
mergeSort(nums,l,mid);
mergeSort(nums,mid+1,r);
merge(nums,l,mid,r);
}
public void merge(int[] nums,int l,int mid,int r){
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(nums[i]<=nums[j]){
tmp[k++]=nums[i++];
}else{
//计算逆序的对数
ans=ans+mid-i+1;
tmp[k++]=nums[j++];
}
}
while(i<=mid) tmp[k++]=nums[i++];
while(j<=r) tmp[k++]=nums[j++];
for(int x=l;x<=r;x++){
nums[x]=tmp[x];
}
}
}