题目
Given an array nums
, we call (i, j)
an important reverse pair if i < j
and nums[i] > 2*nums[j]
.
You need to return the number of important reverse pairs in the given array.
Example1:
Input: [1,3,2,3,1] Output: 2
Example2:
Input: [2,4,3,5,1] Output: 3
Note:
- The length of the given array will not exceed
50,000
. - All the numbers in the input array are in the range of 32-bit integer.
题解
这是一道比较难的题,借鉴了
shawngao的归并排序的思路。将数组分成左右两个数组,并分别排序,之后对于左边数组的每一个数m,只要找出右边的数组的第一个比m/2大的数即可得出数m的逆序数对个数(因为右边数组是排好序的,第一个比m/2大的数前面的数都可以和m构成逆序数对)。将这些数的逆序数对个数加起来,再加上两个子数组的逆序数对个数即可。
代码
public class Solution {
public int reversePairs(int[] nums) {
return mergeSort(nums, 0, nums.length-1);
}
private int mergeSort(int[] nums, int s, int e){
if(s>=e) return 0;
int mid = s + (e-s)/2;
int cnt = mergeSort(nums, s, mid) + mergeSort(nums, mid+1, e);
for(int i = s, j = mid+1; i<=mid; i++){
while(j<=e && nums[i]/2.0 > nums[j]) j++;
cnt += j-(mid+1);
}
Arrays.sort(nums, s, e+1);
return cnt;
}
}