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
这道题一看就是二分查找的典型题,再用一个同样大的数组保存元素2*nums的值,然后对这个数组排序。剩下的操作都是显而易见了,全是二分查找的基本操作,不多说了直接上代码。
class Solution {
public:
vector<long>::iterator find(vector<long>& tmp,long aim)
{
int a=0,b=tmp.size()-1;
while(a<b)
{
int c=(a+b)/2;
if(tmp[c]>aim)
b=c-1;
else if(tmp[c]<aim)
a=c+1;
else
return tmp.begin()+c;
}
return tmp.begin()+a;
}
int count(vector<long>& tmp,int a)
{
int begin=0,end=tmp.size()-1,middle;
if(end<0)
return 0;
while(begin<end)
{
middle=(begin+end)/2;
if(tmp[middle]<a)
begin=middle+1;
else
end=middle;
}
if(tmp[begin]>=a)
return begin;
else
return tmp.size();
}
int reversePairs(vector<int>& nums) {
int n=nums.size();
vector<long >tmp(n,0);
for(int i=0;i<n;i++)
tmp[i]=(long )nums[i]*2L;
int ans=0;
sort(tmp.begin(),tmp.end());
for(int i=0;i<n;i++)
{
long aim=(long)nums[i]*2L;
vector<long>::iterator iter=find(tmp,aim);
tmp.erase(iter);
ans+=count(tmp,nums[i]);
}
return ans;
}
};