给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
代码
class Solution {
public int reversePairs(int[] nums) {
return getReversePairs(nums,0,nums.length-1);
}
public int getReversePairs(int[] nums,int l,int r) {
if(l>=r) return 0;
int mid=(l+r)/2;
int ret=getReversePairs(nums, l, mid)+getReversePairs(nums, mid+1, r);//将左右数组排序,并统计结果
int i=l,j=mid+1;
while (i<=mid)//统计左右数组的反转对
{
while (j<=r&&(long)nums[i]>2*(long)nums[j])
j++;
ret+=j-mid-1;
i++;
}
int []temp=new int[r-l+1];
int p=0,p1=l,p2=mid+1;
while (p1<=mid||p2<=r)//归并
{
if(p1>mid)
temp[p++]=nums[p2++];
else if(p2>r)
temp[p++]=nums[p1++];
else if(nums[p1]>=nums[p2])
temp[p++]=nums[p2++];
else temp[p++]=nums[p1++];
}
for(int k=0;k<temp.length;k++) nums[l+k]=temp[k];//写回原来数组
return ret;
}
}