码迷,mamicode.com
首页 > 其他好文 > 详细

Maximum Gap

时间:2015-06-23 19:57:47      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

这里要用到桶排序,感觉不太感兴趣,就直接看了网上的做法。

C++中vector中的一些常用函数:

取容器中的最大最小值min_element(),max_element()。

当有必要对一个接受pair参数的函数传递两个值时, make_pair()尤其显得方便。

int minAll = *min_element(nums.begin(), nums.end());

int maxAll = *max_element(nums.begin(), nums.end());

vector<pair<int, int> > buckets(bucketCount, make_pair(INT_MIN, INT_MAX));

 // 用桶排序
 // 算出相邻两个桶之间的最大差值
 // 如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是0(n)
 // 我们假设桶的个数和元素的数目相同,若是平均分布,则每个桶里有一个数,而若某个桶里有两个以上的桶时,这时必有至少一个是空桶,那么最大间隔可能就落在空桶的相邻两个桶存储的数之间,最大间隔不会落在同一个桶的数里,因此我们不需要对每个桶再排一次序,只需要记录同一个桶的最大值和最小值,算出前一个有最大值的桶和后一个有最小值的桶之差,则可能是最大间隔
 //步骤:1.算好用的桶的个数,用最大元素和最小元素算出平均间隔,记录在平均间隔上的最大值和最小值,
 // 2. 再算出前一个间隔里的最大值和后一个间隔里的最小值之差,取最大的一个,
 // 3. 再算出最小值和第二小的差(平均间隔最小值第一个),最大值和第二大(平均间隔最大值最后一个)的差,三个值相比,取最大的,就是最大间隔
class Solution {
public:
    int maximumGap(vector<int>& nums) {
         if (num.size() < 2) return 0;
        // 1. 算出用的桶数:取平均间隔,再用最大值和最小值之差除以间隔,得到桶数
        // 因为假设所有值都是平均分布的时候,如此取桶数可得时间复杂度是0(n)
        auto maxVal = *max_element(num.begin(), num.end());
        auto minVal = *min_element(num.begin(), num.end());
        int agGap = ceil((double)(maxVal - minVal) / (num.size()-1)); // 平均间隔
        int bucketCount = ceil((double)(maxVal - minVal) / agGap);
        // 2. 记录每个桶的最大值和最小值
        vector<pair<int, int> > buckets(bucketCount, make_pair(INT_MIN, INT_MAX)); // 初始化桶
        for (auto val : num){
            if (val == maxVal || val == minVal) continue;
            int bucketNum = (val - minVal) / agGap;
            if (val > buckets[bucketNum].first) 
                buckets[bucketNum].first = val; // 存储最大值
            if (val < buckets[bucketNum].second) buckets[bucketNum].second = val; // 存储最小值
        }
        // 3. 算出最大间隔
        int maxGap(0), lastMax(minVal);
        for (auto bucket : buckets){
            if (bucket.first == INT_MIN) continue; // 空桶
            int curMax(bucket.first), curMin(bucket.second);
            maxGap = max(maxGap, curMin - lastMax);
            lastMax = curMax;
        }
        maxGap = max(maxGap, maxVal - lastMax);
        return maxGap;
        
    }
};

 



 

Maximum Gap

标签:

原文地址:http://www.cnblogs.com/qiaozhoulin/p/4595893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!