Maximum Gap

来源:互联网 发布:中国取黑人媳妇知乎 编辑:程序博客网 时间:2024/06/04 01:03

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.

题目来自leetcode

解法1 :来自http://www.cnblogs.com/skysand/p/4179099.html

class Solution {public:    // 用桶排序    // 算出相邻两个桶之间的最大差值    // 如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是0(n)    // 我们假设桶的个数和元素的数目相同,若是平均分布,则每个桶里有一个数,而若某个桶里有两个以上的桶时,这时必有至少一个是空桶,那么最大间隔可能就落在空桶的相邻两个桶存储的数之间,最大间隔不会落在同一个桶的数里,因此我们不需要对每个桶再排一次序,只需要记录同一个桶的最大值和最小值,算出前一个有最大值的桶和后一个有最小值的桶之差,则可能是最大间隔    //步骤:1.算好用的桶的个数,用最大元素和最小元素算出平均间隔,记录在平均间隔上的最大值和最小值,    // 2. 再算出前一个间隔里的最大值和后一个间隔里的最小值之差,取最大的一个,    // 3. 再算出最小值和第二小的差(平均间隔最小值第一个),最大值和第二大(平均间隔最大值最后一个)的差,三个值相比,取最大的,就是最大间隔    int maximumGap(vector<int> &num) {        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;    }};
解法2:自己的解法

class Solution {public:    int maximumGap(vector<int>& nums) {        if(nums.size()<2)            return 0;        int minAll=INT_MAX;        int maxAll=INT_MIN;        for(int i=0; i<nums.size(); i++){            minAll=min(nums[i], minAll);            maxAll=max(nums[i], maxAll);        }                int len=maxAll-minAll;        if(len<=1)            return len;        double gap=(double)len/(nums.size()-1);//这里必须要用double,如:{1,1,1,1,1, 5,5,5,5,5}此时如果是int,后面的计算都是除以0了                vector<int> bucket_min(nums.size(), INT_MAX);        vector<int> bucket_max(nums.size(), INT_MIN);        int idx;        for(int i=0; i<nums.size(); i++){            idx=(nums[i]-minAll)/gap;            bucket_min[idx]=min(nums[i], bucket_min[idx]);            bucket_max[idx]=max(nums[i], bucket_max[idx]);        }                int last_max=bucket_max[0];        int ans=0;        for(int i=1; i<nums.size(); i++){            if(bucket_max[i]==INT_MIN)                continue;            ans=max(ans, bucket_min[i]-last_max);            last_max=bucket_max[i];        }        return ans;    }};





0 0
原创粉丝点击