[leedcode 164] 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.
public class Solution { public int maximumGap(int[] nums) { /* 桶排序 假设有取值范围为A到B的N个元素,则他们的最大gap不会小于celling[(B - A) / (N - 1)]。 让桶的长度len = celling[(B - A) / (N - 1)],则我们最多会有num = (B - A) / len + 1个桶(N)。 对于数组中的任意元素K,我们可以通过计算toc = (K - A) / len轻松的找到它属于哪一个桶,然后我们维护每个桶中的最大值和最小值。 由于同一个桶中元素的最大差值是len - 1,所有最后的答案不会是来自同一个桶中的两个元素。 对于每一个非空的桶p,找到下一个非空的桶q,然后q.min - p.max就是该问题的潜在的最大值。返回这些值的最大值。*/ if(nums==null||nums.length<=1) return 0; int min=nums[0]; int max=nums[0]; int len=nums.length; for(int i=1;i<len;i++){ min=Math.min(min,nums[i]); max=Math.max(max,nums[i]); } int max_b[]=new int[len]; int min_b[]=new int[len]; for(int i=0;i<len;i++){ int temp=nums[i]; int k=(int)((len-1)*(1.0*(temp-min))/(max-min)); if(min_b[k]==0||min_b[k]>temp) min_b[k]=temp; if(max_b[k]==0||max_b[k]<temp) max_b[k]=temp; } int res=0; int min1=max_b[0]; for(int i=1;i<len;i++){ if(max_b[i]==0) continue; res=Math.max(min_b[i]-min1,res); min1=max_b[i]; } return res; } }