在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
思路:考察一般求逆序数的方法,往往有两种:树状数组或者归并排序,两种都非常好实现,这里我用归并写了一下。
class Solution {
private int ans;
public int reversePairs(int[] nums) {
ans=0;
merge(nums,0,nums.length-1);
return ans;
}
private void merge(int[] nums,int l,int r) {
if(l<r) {
int mid=(l+r)/2;
merge(nums,l,mid);
merge(nums,mid+1,r);
mergeSort(nums,l,mid,r);
}
}
private void mergeSort(int[] nums,int l,int mid,int r) {
int[] arr=new int[r-l+1];
int ls=l,rs=mid+1,len=0;
while(ls<=mid && rs<=r) {
if(nums[ls]<=nums[rs])
arr[len++]=nums[ls++];
else {
ans+=mid-ls+1;
arr[len++]=nums[rs++];
}
}
while(ls<=mid) arr[len++]=nums[ls++];
while(rs<=r) arr[len++]=nums[rs++];
for(int i=0;i<len;i++)
nums[l+i]=arr[i];
}
}