Reverse Pairs
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.
利用归并排序的思路,也叫分割重现关系,用式子表示是T(i,j)=T(i,m)+T(m+1,j)+C,其中C表示翻转对的两个数字分别在子数组nums[i,m]和nums[m+1,j]之间,满足要求的翻转对数,若果我们对这两个数组都是排好序的,那么可以在线性时间内求出翻转对数,我们利用递归思路对两个子数组排序然后求翻转对数。
代码:
class Solution {
public:
int reversePairs(vector<int>& nums) {
return mergesort(nums,0,nums.size()-1);
}
int mergesort(vector<int> &nums, int left,int right)
{
if (left>=right)
return 0;
int mid=(left+right)/2;
int ans=0;
ans=mergesort(nums,left,mid)+mergesort(nums,mid+1,right);
int first=mid;
int second=right;
while ((first>=left)&&(second>=(mid+1)))
{
long long t1=nums[first];
long long t2=(long long )(nums[second])*2;
if (t1>t2)
{
ans+=(second-mid);
first--;
}
else
{
second--;
}
}
sort(nums.begin()+left,nums.begin()+right+1);
return ans;
}
};