493. Reverse Pairs

来源:互联网 发布:众测平台数据安全 编辑:程序博客网 时间:2024/06/01 07:37

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;    }};
1 0