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

leetcode[164]Maximum Gap

时间:2015-02-09 00:32:20      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

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.

注释部分是我刚开始直接按数据结构上的桶排序,然后通过了,便于刚开始理解。

后来参照别人的思路(想不通的话可以自己借助实例数组,自己跟着程序手动走一遍):

    用桶排序
    算出相邻两个桶之间的最大差值
    如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是0(n)
    假设桶的个数和元素的数目相同,若是平均分布,则每个桶里有一个数,而若某个桶里有两个以上的桶时,这时必有至少一个是空桶,那么最大间隔可能就落在空桶的相邻两个桶存储的数之间,最大间隔不会落在同一个桶的数里,因此我们不需要对每个桶再排一次序,只需要记录同一个桶的最大值和最小值,算出前一个有最大值的桶和后一个有最小值的桶之差,则可能是最大间隔
    步骤:1).算好用的桶的个数,用最大元素和最小元素算出平均间隔,记录在平均间隔上的最大值和最小值,
         2). 再算出前一个间隔里的最大值和后一个间隔里的最小值之差,取最大的一个,
         3). 再算出最小值和第二小的差(平均间隔最小值第一个),最大值和第二大(平均间隔最大值最后一个)的差,三个值相比,取最大的,就是最大间隔
class Solution {
public:
int maximumGap(vector<int> &num) 
{
    if(num.size()<2)return 0;
    int maxN=*max_element(num.begin(),num.end());
    int minN=*min_element(num.begin(),num.end());
    int gap=ceil(double(maxN-minN)/(num.size()-1));
    int nBacket=ceil(double(maxN-minN)/gap);
    vector<pair<int, int>> vec(nBacket,make_pair(INT_MAX,INT_MIN));
    for (int i=0;i<num.size();i++)
    {
        if(num[i]==maxN||num[i]==minN)continue;
        int nBack=(num[i]-minN)/gap;
        if (num[i]<vec[nBack].first)vec[nBack].first=num[i];
        if(num[i]>vec[nBack].second)vec[nBack].second=num[i];
    }
    int maxGap=0;
    int pre=minN;
    for(int i=0;i<nBacket;i++)
    {
        if(vec[i].second==INT_MIN)continue;
        int tmp=vec[i].first-pre;
        maxGap=maxGap>tmp?maxGap:tmp;
        pre=vec[i].second;
    }
    maxGap=maxGap>maxN-pre?maxGap:maxN-pre;
    return maxGap;
}
/**
int maximumGap(vector<int> &num) {
    if(num.size()<2)return 0;
    vector<int> vec0;
    vector<vector<int>> vec1(10,vec0);
    vector<int> tmp(num);
    int min=*min_element(num.begin(),num.end());
    int max=*max_element(num.begin(),num.end());
    int loop=0;
    int tmax=max;
    while (tmax)
    {
        tmax/=10;
        loop++;
    }
    int power=1;
    for (int i=0;i<loop;i++)
    {
        if(i==0)power=1;
        else power*=10;
        vector<vector<int>> vec(vec1);
        for (int k=0;k<tmp.size();k++)
        {
            int n=tmp[k]/power-(int(tmp[k]/(10*power)))*10;
            vec[n].push_back(tmp[k]);
        }
        tmp.clear();
        for(int j=0;j<10;j++)
        {
            if(vec[j].empty())continue;
            else
            {
                for (int jj=0;jj<vec[j].size();jj++)
                {
                    tmp.push_back(vec[j][jj]);
                }
            }
        }
    }
    int maxGap=tmp[1]-tmp[0];
    for (int i=2;i<tmp.size();i++)
    {
        maxGap=maxGap>tmp[i]-tmp[i-1]?maxGap:tmp[i]-tmp[i-1];
    }
    return maxGap;
}
*/
};

 

leetcode[164]Maximum Gap

标签:

原文地址:http://www.cnblogs.com/Vae98Scilence/p/4280693.html

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