493 Reverse Pairs 翻转对

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
    给定数组的长度不会超过50000。
    输入数组中的所有数字都在32位整数的表示范围内。
详见:https://leetcode.com/problems/reverse-pairs/description/

C++:

class Solution {
public:
    int reversePairs(vector<int>& nums) {
        int n = nums.size();
        if(n <= 1)
        {
            return 0;       
        }
        int cnt = 0;
        vector<int> b(nums.begin(), nums.begin() + n / 2);
        vector<int> c(nums.begin() + n / 2, nums.end());
        cnt += reversePairs(b);
        cnt += reversePairs(c);
        int ai = 0, bi = 0, ci = 0;
        while(ai < n)
        {
            if(bi < b.size() && (ci == c.size() || b[bi] <= c[ci]))
            {
                nums[ai++] = b[bi++];
            }
            else
            {
                long tmp2 = (long)c[ci]*2;
                int low = 0,high = b.size() - 1,pos = bi;
                while(low <= high)
                {
                    pos = (low + high)/2;
                    if((long)b[pos] == tmp2)
                    {
                        low++;
                    }
                    else if((long)b[pos] > tmp2)
                    {
                        high = pos - 1;
                    }
                    else
                    {
                        low = pos + 1;
                    }
                }
                if(low < b.size() && low >= 0 && (long)b[low] > tmp2)
                {
                    cnt += n/2 - low;
                }
                nums[ai++] = c[ci++];
            }
        }
        return cnt;
    }
};

 参考:https://blog.csdn.net/lin360580306/article/details/60326795

posted on 2018-04-21 22:53  lina2014  阅读(268)  评论(0编辑  收藏  举报

导航