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.
想法1:
先对原数组进行排序,然后遍历排序后数组找出最大gap.
public class Solution {
public int maximumGap(int[] nums) {
if(nums.length<2)return 0;
Arrays.sort(nums);
int maxGap=0;
for(int i=0;i<nums.length-1;i++){
int gap=nums[i+1]-nums[i];
if(gap>maxGap)maxGap=gap;
}
return maxGap;
}
}
使用了java的Arrays.sort()函数,为quicksort。总时间复杂度为O(nlogn)+O(n)=O(nlogn)。
想法2:
使用bucket排序,将average gap作为bucket宽度,将各个数值放在bucket内,获得每个bucket的最大值和最小值,则gap最大值必定出现在后面一个bucket最小值和前一个bucket最大值差值当中,进行遍历。
public class Solution {
public int maximumGap(int[] nums) {
if(nums.length<2)return 0;
int max=nums[0];
int min=nums[0];
int maxGap=0;
for(int i=1;i<nums.length;i++){
max=Math.max(max,nums[i]);
min=Math.min(min,nums[i]);
}
int minGap=(int)Math.ceil((double)(max-min)/(nums.length-1));
int maxBucket[]=new int [nums.length];
int minBucket[]=new int [nums.length];
Arrays.fill(maxBucket,Integer.MIN_VALUE);
Arrays.fill(minBucket,Integer.MAX_VALUE);
for(int j=0;j<nums.length;j++){
maxBucket[(int)((nums[j]-min)/minGap)]=Math.max(maxBucket[(int)((nums[j]-min)/minGap)],nums[j]);
minBucket[(int)((nums[j]-min)/minGap)]=Math.min(minBucket[(int)((nums[j]-min)/minGap)],nums[j]);
}
int oldMax=min;
for(int m=0;m<nums.length;m++){
if(maxBucket[m]==Integer.MIN_VALUE)continue;
else {maxGap=Math.max(maxGap,minBucket[m]-oldMax);
oldMax=maxBucket[m];}
}
return maxGap;
}
}
小技巧:判断某bucket是否为空,可以在初始化时将该bucket最大值设置为Integer.MIN_VALUE,若最后发生改变则不为空,未发生改变则为空可以跳过。
Arrays.fill(a,b) 将array a全填充b元素
(int)Math.ceil(double a)取大于等于a的最小整数
(int)Math.floor(double a)去小于等于a的最大整数