Leetcode: 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.

比较困难啊,bucket排序的思想。最小的gap是N个数均匀分布的情况,(max - min) / (N - 1)。把N个数分成(N-1)个bucket,那么最大的gap不会在同一个bucket之内,因为这时bucket的大小为(max - min) / (N - 1);所以只需计算前一个bucket的最大值和下一个bucket的最小值的gap。

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        if (nums.size() < 2) {
            return 0;
        }
        
        auto minMax = minmax_element(nums.begin(), nums.end());
        int minNum = *minMax.first;
        int maxNum = *minMax.second;
        int bucketSize = max((maxNum - minNum) / (static_cast<int>(nums.size()) - 1), 1);
        int bucketNum = (maxNum - minNum) / bucketSize + 1;
        vector<int> bucketMin(bucketNum, INT_MAX);
        vector<int> bucketMax(bucketNum, INT_MIN);
        for (const auto& num : nums) {
            int index = (num - minNum) / bucketSize;
            bucketMin[index] = min(bucketMin[index], num);
            bucketMax[index] = max(bucketMax[index], num);
        }
        
        int maxGap = bucketMax[0] - bucketMin[0];
        int prevMax = bucketMax[0];
        for (int i = 1; i < bucketMin.size(); ++i) {
            if (bucketMin[i] == INT_MAX) {
                continue;
            }
            maxGap = max(maxGap, bucketMin[i] - prevMax);
            prevMax = bucketMax[i];
        }
        
        return maxGap;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值