Maximum Gap

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.


tips:单看题目本身的话,不算难,但是要在线性时间和空间内解决就难了,我想了半天也没有很好的注意,网上搜索后发现要使用bucket桶排序,记录一下吧:

假设有N个元素A到B。

那么最大差值不会小于ceiling[(B - A) / (N - 1)], 根据鸽巢原理。

令bucket(桶)的大小len = ceiling[(B - A) / (N - 1)],则最多会有(B - A) / len + 1个桶

对于数组中的任意整数K,很容易通过算式loc = (K - A) / len找出其桶的位置,然后维护每一个桶的最大值和最小值

由于同一个桶内的元素之间的差值至多为len - 1,因此最终答案不会从同一个桶中选择。

对于每一个非空的桶p,找出下一个非空的桶q,则q.min - p.max可能就是备选答案。返回所有这些可能值中的最大值。

以后重刷的时候希望可以自己写出来


class Solution {
public:
    int maximumGap(vector<int> &num) {
        int n = num.size();
        if (n < 2) return 0;
        if (n == 2) return abs(num[0] - num[1]);
        int imin = num[0], imax = num[0];
        for (int i = 0; i < n; ++i) {
            imin = min(imin, num[i]);
            imax = max(imax, num[i]);
        }
        int dist = (imax-imin) / n + 1;
        vector<vector<int> > bucket((imax-imin)/dist + 1);
        int idx;
        for (int i = 0; i < n; ++i) {
            idx = (num[i] - imin) / dist;
            if (bucket[idx].empty()) {
                bucket[idx].push_back(num[i]);
                bucket[idx].push_back(num[i]);
            } else {
                bucket[idx][0] = min(bucket[idx][0], num[i]);
                bucket[idx][1] = max(bucket[idx][1], num[i]);
            }
        }
        int gap = 0, pre = 0, tmp;
        for (int i = 1; i < bucket.size(); ++i) {
            if (bucket[i].empty()) continue;
            tmp = bucket[i][0] - bucket[pre][1];
            gap = max(gap, tmp);
            pre = i;
        }
        return gap;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值