首页 > 其他 > 详细

493 Reverse Pairs 翻转对

时间:2018-04-21 23:13:18      阅读:648      评论:0      收藏:0      [点我收藏+]

给定一个数组 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

493 Reverse Pairs 翻转对

原文:https://www.cnblogs.com/xidian2014/p/8904156.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!