LeetCode Maximum Gap的O(N)解法

// Date : 2016.08.10
// Author : yqtao
// https://github.com/yqtaowhu
/************************************************************************
*
* 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.
*
************************************************************************/

#include <iostream>
#include <vector>
#include<string>
#include<algorithm>
using namespace std;
int maximumGap(vector<int>& nums) {
    int n = nums.size();
    if (n < 2) return 0;
    auto lh= minmax_element(nums.begin(), nums.end());
    int min_value = *lh.first, max_value = *lh.second;
    if (min_value == max_value) return 0;
    vector<bool> flag(n + 1, false); //表示桶是否为空
    vector<int> bucketMin(n+1,0);
    vector<int> bucketMax(n+1,0);
    for (int i = 0; i< n; i++) {    //分配桶号,和桶的最大最小值
        int bid = static_cast<int>((nums[i] - min_value) / (max_value - min_value + 0.0)*n);  //获得桶号
        bucketMin[bid] = flag[bid] ? min(bucketMin[bid], nums[i]) : nums[i];
        bucketMax[bid] = flag[bid] ? max(bucketMax[bid], nums[i]) : nums[i];
        flag[bid] = true;
    }
    int max_result = bucketMax[0], result = 0;
    for (int i = 1; i < n + 1; i++) {
        if (flag[i]) {
            result = max(bucketMin[i] - max_result, result);
            max_result = bucketMax[i];  //每次更新桶值
        }
    }
    return result;
}
int main() {
    vector<int> v = { 601408776,63967816,431363697,242509930,15970592,60284088,228037800,147629558};
    cout << maximumGap(v) << endl;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值