zoukankan      html  css  js  c++  java
  • 【leetcode】Maximum Gap

    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.

    Credits:
    Special thanks to @porker2008 for adding this problem and creating all test cases.

     
     
    如果不考虑题目中要求的Linear time/space,实际上只需要先sort,然后找到最大的就可以了。
     1 class Solution {
     2 public:
     3     int maximumGap(vector<int> &num) {
     4        
     5         if(num.size()<2)        
     6             return 0;        
     7        
     8         sort(num.begin(),num.end());       
     9         int max=0;
    10        
    11         for(int i=0;i<num.size()-1;i++)
    12         {
    13             if(num[i+1]-num[i]>max)            
    14                 max=num[i+1]-num[i];            
    15         }
    16         return max;
    17     }
    18 };

     

     
    符合题意的方法:
     
    由于num中的数字肯定在[min,max]区间内,所以根据抽屉原理,假设num中有n个数字,则最大的gap必然要大于dis=(max-min)/(n-1),所以我们可以把num所在的范围分成等间隔的区间,相邻区间内的元素之间的最大差值,即为要寻找的gap
     
     1 class Solution {
     2 public:
     3     int maximumGap(vector<int> &num) {
     4        
     5         if(num.size()<2) return 0;
     6         if(num.size()==2) return abs(num[0]-num[1]);
     7        
     8         int n=num.size();
     9         int min,max,i;
    10        
    11         min=max=num[0];
    12        
    13         for(i=0;i<num.size();i++)
    14         {
    15             if(min>num[i]) min=num[i];
    16             if(max<num[i]) max=num[i];
    17         }
    18  
    19         // 找到区间间隔
    20         //注意此处,也可以写成(max-min)/n+1,此时就不需要num.size()==2的边界条件了        
    21         int dis=(max-min)/(n-1)+1;
    22        
    23         vector<vector<int> > bucket((max-min)/dis+1);
    24        
    25         for(i=0;i<n;i++)
    26         {
    27             int x=num[i];
    28             int index=(x-min)/dis;
    29             //把元素放入不同的区间中
    30             if(bucket[index].empty())
    31             {
    32                 bucket[index].reserve(2);
    33                 bucket[index].push_back(x);
    34                 bucket[index].push_back(x);
    35             }
    36             else
    37             {
    38                 if(bucket[index][0]>x) bucket[index][0]=x;
    39                 if(bucket[index][1]<x) bucket[index][1]=x;
    40             }
    41         }
    42        
    43         int pre=0;
    44         int gap=0;
    45        
    46         //在相邻的区间中(区间内有元素的相邻区间)寻找最大的gap
    47         for(i=1;i<bucket.size();i++)
    48         {
    49             if(bucket[i].empty()) continue;
    50            
    51             int tmp=bucket[i][0]-bucket[pre][1];
    52             if(gap<tmp) gap=tmp;
    53             pre=i;
    54         }
    55         return gap;
    56     }
    57 };

      

  • 相关阅读:
    NetCore DockerDesktop 踩坑记录
    VS2019 docker desktop 调试 vsdbg下载出错。
    Git 操作
    SQLServer远程连接失败的问题
    Echarts dataZoom缩放功能参数详解:
    flex布局
    解决vue项目中使用/deep/报错
    vue上传图片或文件
    github连接超时,经常打不开的问题
    vue2.0与vue3.0 双向数据绑定的理解
  • 原文地址:https://www.cnblogs.com/reachteam/p/4245961.html
Copyright © 2011-2022 走看看