zoukankan      html  css  js  c++  java
  • 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;
        }
    };        
    

      

  • 相关阅读:
    sqlserver和Oracle内部的错误数据修复(DBCC、DBMS_REPAIR)
    通过Oracle补充日志,找到锁阻塞源头的SQL
    禁用sqlserver的锁升级
    [转]SQLServer2008日志文件无法收缩处理方法
    Oracle警告、跟踪文件(10046、死锁等跟踪)
    dbms_stats包更新、导出、导入、锁定统计信息
    BulkCopy频繁执行产生的性能问题
    Oracle表空间不足
    组合索引字段顺序引发的死锁问题
    如何清除某条SQL的执行计划
  • 原文地址:https://www.cnblogs.com/YaoDD/p/5233966.html
Copyright © 2011-2022 走看看