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.
題目鏈接:https://leetcode-cn.com/problems/reverse-pairs/
思路
用歸併排序的思路,不斷向下劃分到小區間,因爲merge的2段都是有序的,因此找逆序快,每次merge只看當前的逆序數量,向上再不斷累加。
class Solution {
public:
int reversePairs(vector<int>& nums) {
int len = nums.size();
if(len<=1) return 0;
vector<int> tmp(len);
return sort(nums, tmp, 0, len-1);
}
int sort(vector<int> &nums, vector<int> &temp, int l, int r){
if(l>=r) return 0;
int mid = l + (r-l)/2;
int sum = sort(nums, temp, l, mid) + sort(nums, temp, mid+1, r);
//merge
int l1 = l, l2 = mid+1;
while(l1<=mid && l2<=r){
if((long)nums[l1] > (long)nums[l2]*2){
sum += (mid-l1+1);
++l2;
}else{
++l1;
}
}
//sort
int idx=0;
l1 = l;
l2 = mid+1;
while(l1<=mid && l2<=r){
if(nums[l1]<=nums[l2]){
temp[idx++] = nums[l1++];
}else{
temp[idx++] = nums[l2++];
}
}
while(l1<=mid){
temp[idx++] = nums[l1++];
}
while(l2<=r){
temp[idx++] = nums[l2++];
}
for(int i=l; i<=r; ++i){
nums[i] = temp[i-l];
}
return sum;
}
};