LeetCode 164. Maximum Gap

题解

求连续极大差,要求O(n)。
利用鸽笼原理。
先给出一个前置条件,即最大差不小于(max-min)/(n-1),为什么?
想象一个阶梯,阶梯间的最大高度差和平均高度差的关系。
有了这个差值,我们可以把原数组依据其所在区间分为n-1个桶。
显然落于同一个桶内的数我们不关心,我们只关心相邻桶间的数。
n个数,除了最大最小之外,还有n-2个数,入n-1个桶,至少有一个桶没有数。
答案就是跨越这个空桶(可能不止一个)的两边桶间 最大数的差值。

ps:具体实现的时候每个桶内只存区间内最大最小值。这样相邻的好计算。


Code

int maximumGap(vector<int>& nums) {
        if(nums.empty()||nums.size()<2) return 0;
        int n=nums.size();
        
        int _max,_min;
        _max=_min=nums[0];
        for(int i:nums){
            _max=max(_max,i);
            _min=min(_min,i);
        }
        if(_max==_min) return 0;
        
        double gap = (double)(_max-_min)/(n-1);
        
        vector<int> g_min(n,INT_MAX);
        vector<int> g_max(n,INT_MIN);
        
        for(int num:nums){
            int idx = (num-_min)/gap;
            g_min[idx]=min(g_min[idx],num);
            g_max[idx]=max(g_max[idx],num);
        }
        
        int res=0,pre=g_max[0];
        for(int i=1;i<n;i++){
            if(g_min[i]==INT_MAX && g_max[i]==INT_MIN) continue;
            res=max(res,g_min[i]-pre);// cur_min - pre_max
            pre=g_max[i];
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值