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 };