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.
参考资料:here。
这道题使用暴力搜索是肯定不行的,但是优化难度非常大,好在有大佬已经想出了优质解答。
这道题使用的技巧为Partition Recurrence Relation,核心思想是将问题分割为子问题,先处理子问题,然后合并。
class Solution {
private:
int merge(vector<int>& nums, int left, int right){
if(left>=right) return 0;
int mid = left+(right-left)/2;
int ans = merge(nums, left, mid)+merge(nums, mid+1, right);
for(int i=left,j=mid+1;i<=mid;i++){
while(j<=right&&nums[i]/2.0>nums[j]) j++;
ans+=j-(mid+1);
}
sort(nums.begin()+left, nums.begin()+right+1);
return ans;
}
public:
int reversePairs(vector<int>& nums) {
return merge(nums, 0, nums.size()-1);
}
};