[LeetCode164]Maximum Gap

HARD

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.

Hide Tags Sort

这题不是收费题,就是一道bucket sort。。但也研究了好久。

这个链接讲的蛮好的:

https://leetcode.com/discuss/51039/12ms-c-suggested-solution

这道题要找最大的两个元素(sort之后相邻)的gap, 所以假如array是: 1,9,2,5。 sort完:1,2,5,9。最大gap是4。对于array, size = 4, lower = 1, upper = 9,所以我们可以猜测其gap至少为3(1,3,8,9)。 bucket 有多少个呢? gap至少是3, 最大最小元素之差是8, 要把四个number装进buckt 则m = (u - l) / 3 + 1 = 3 个。具体讲起来就跟链接说的一样,只不过很多很精妙的处理啊,学渣肯定不会啊。。所以要好好研究一下!

ps: c++的auto lu = minmax_element(nums.begin(), nums.end());简直让我没听说过。所以最小元素是 lower = *lu.first 最大元素是upper = *lu.second

贴上code:

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        if (nums.size()<2) return 0;
        auto lu = minmax_element(nums.begin(), nums.end());
        int l = *lu.first;
        int u = *lu.second;
        int n = nums.size();
        int gap = max((u-l)/(n-1), 1);
        int m = (u-l)/gap + 1;
        vector<int> minBucket(m,INT_MAX);
        vector<int> maxBucket(m,INT_MIN);
        for (int num : nums){
            int k = (num - l)/gap;
            if (num < minBucket[k]) minBucket[k] = num;
            if (num > maxBucket[k]) maxBucket[k] = num;
        }
        int i=0, j = 0;
        gap = maxBucket[0] - minBucket[0];
        while (i<m) {
            j = i+1;
            while (j<m && minBucket[j] == INT_MAX && maxBucket[j] == INT_MIN) {
                ++j;
            }
            if  (j == m) break;
            gap = max((minBucket[j] - maxBucket[i]), gap);
            i = j;
        }
        return gap;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值