leetcode 164:Maximum Gap

题意:

给定非排序数组,找出其排序后相邻元素的最大差值。

线性时间空间、元素数少于2时返回0、元素值非负且int范围内。

思路:

排序最快nlogn不符合要求;

参考网上,学习了桶排序的方法;

桶排序:按值分段处理;

设定桶大小和桶个数;

因为ans>=(MAX-MIN)/(len-1);

桶大小:(MAX-MIN)/(len-1)向上取整,(注意为0时取1)

桶个数:(MAX-MIN)/桶大小+1;

ans取值只可能是桶A的最小值-桶B的最大值形式;不会在桶内取;(因为桶内最大差值小于桶大小)

 1 class Solution {
 2 public:
 3     int maximumGap(vector<int>& nums) {
 4         int len = nums.size();
 5         if(len<2)
 6             return 0;
 7         int minv = nums[0];
 8         int maxv = nums[0];
 9         for(int i=1;i<len;i++)
10         {
11             if(nums[i]<minv)
12                 minv = nums[i];
13             if(nums[i]>maxv)
14                 maxv = nums[i];
15         }
16         if(maxv==minv)
17             return 0;
18         int x = (maxv-minv)/(len-1);
19         if(x!=(maxv-minv)*1.0/(len-1)||x==0) //小数4.1
20         {
21             x++;
22         }
23         int n = (maxv-minv)/x+1;
24         vector<int> bmin(n,INT_MAX);
25         vector<int> bmax(n,INT_MIN);
26 
27 
28         for(int i=0;i<len;i++)
29         {
30             int p = (nums[i]-minv)/x;
31             bmin[p] = min(bmin[p],nums[i]);
32             bmax[p] = max(bmax[p],nums[i]);
33         }
34         int ans = -1;
35         int last = -1;
36         for(int i=0;i<n;i++)
37         {
38             if(bmin[i]==INT_MAX)
39                 continue;
40             if(last == -1)
41             {
42                 last = bmax[i];
43                 continue;
44             }
45             ans = max(ans, bmin[i]-last );
46             last = bmax[i];
47         }
48         return ans;
49     }
50 };
View Code
原文地址:https://www.cnblogs.com/jsir2016bky/p/5982762.html