LeetCode题解-----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.

 

分析:

利用桶排序求解。首先,遍历数组nums[]求得min和max。假设数组共有N个数,则所求的解必然大于等于len=(max-min)/(N-1)(向上取整,且在N个数均匀分布时取得)。接着再遍历一次数组,将(nums[i]-min)/len作为下标,放入相应的桶中。其中,每个桶只需要维护该桶内的最大值和最小值即可。因为,每个桶里面所有的数最大不会相差len,所以桶内部是不存在解的,因此解只可能在相邻的桶中获得,即后一个桶的最小值减去前一个桶的最大值是可能的解。最后再从这些差值中取得一个最大值即可。

 

代码:

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        if(nums.size()<2){
            return 0;
        }
        
        int min=nums[0],max=nums[0];
        for(int i=1;i<nums.size();i++){
            min = nums[i]<min ? nums[i]:min;
            max = nums[i]>max ? nums[i]:max;
        }
        
        if(min==max){            //数组中每个元素都相同
            return 0;
        }
        
        int len;
        if((max-min)%(nums.size()-1)==0){
            len=(max-min)/(nums.size()-1);
        }else{
            len=(max-min)/(nums.size()-1)+1;
        }
        
        //每个桶只要保存最大值和最小值即可
        int* bMin=new int[nums.size()];
        int* bMax=new int[nums.size()];
        
        for(int i=0;i<nums.size();i++){
            bMax[i]=0x80000000;
        }
        
        for(int i=0;i<nums.size();i++){
            int p=(nums[i]-min)/len;
            if(bMax[p]==0x80000000){    //空桶直接插入
                bMax[p]=bMin[p]=(nums[i]-min);
            }else{
                bMax[p] = bMax[p]>(nums[i]-min) ? bMax[p]:(nums[i]-min);
                bMin[p] = bMin[p]<(nums[i]-min) ? bMin[p]:(nums[i]-min);
            }
        }
        
        int pre=0;
        int cur=1;
        int ans=0x80000000;
        while(cur<nums.size()){        
            while(cur<nums.size()&&bMax[cur]==0x80000000){//找到下一个不为空的桶
                cur++;
            }
            if(cur==nums.size()){
                break;
            }
            ans = ans>(bMin[cur]-bMax[pre]) ? ans:(bMin[cur]-bMax[pre]);
            pre=cur;
            cur++;
        }
        
        return ans;
    }
};        

  

posted on 2016-03-02 10:38  姚灯灯!  阅读(368)  评论(0编辑  收藏  举报

导航