zoukankan      html  css  js  c++  java
  • leetcode[164]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.

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

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

        用桶排序
        算出相邻两个桶之间的最大差值
        如果是平均分布,则桶的数目和元素的数目相同时,其排序的时间复杂度是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;
    }
    */
    };
  • 相关阅读:
    等待
    QToolBox工具箱
    组合框QGroupBox
    把ui界面加入到工程中
    assistant文档
    日期与时间控件QDate, QTime, QDateTime
    日历控件QCalendarWidget
    液晶数字显示屏QLCDNumbe
    ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行
    使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度
  • 原文地址:https://www.cnblogs.com/Vae1990Silence/p/4280693.html
Copyright © 2011-2022 走看看