给定一个无序的数组,找出数组在排序后相邻的元素之间最大的差值。
尽量尝试在线性时间和空间复杂度情况下解决此问题。
若数组元素个数少于2,则返回0。
假定所有的元素都是非负整数且范围在32位有符号整数范围内。
详见:https://leetcode.com/problems/maximum-gap/description/
Java实现:题目要求是要线性的时间和空间,那么只能用桶排序。同一个桶里的数差值不会有不同桶间的差值大,所以找桶内最大和下一个非空桶的桶内最小进行比较即可。
class Solution { public int maximumGap(int[] nums) { int n=nums.length; if (nums == null || n < 2){ return 0; } // 计算数组中的最大值和最小值 int min = nums[0]; int max = nums[0]; for (int num:nums) { min = min>num?num:min; max = max<num?num:max; } // the minimum possibale gap, ceiling of the integer division int gap = (int)Math.ceil((double)(max - min)/(n - 1)); int[] bucketsMIN = new int[n - 1]; // 记录桶中的最小值 int[] bucketsMAX = new int[n - 1]; // 记录桶中最大值 Arrays.fill(bucketsMIN, Integer.MAX_VALUE); Arrays.fill(bucketsMAX, Integer.MIN_VALUE); // put numbers into buckets for (int num:nums) { if (num == min || num == max){ continue; } int idx = (num - min) / gap; // index of the right position in the buckets bucketsMIN[idx] = Math.min(num, bucketsMIN[idx]); bucketsMAX[idx] = Math.max(num, bucketsMAX[idx]); } // scan the buckets for the max gap int maxGap = Integer.MIN_VALUE; int previous = min; for (int i = 0; i < n - 1; i++) { if (bucketsMIN[i] == Integer.MAX_VALUE && bucketsMAX[i] == Integer.MIN_VALUE){ // 跳过空桶 continue; } // min value minus the previous value is the current gap maxGap = Math.max(maxGap, bucketsMIN[i] - previous); // update previous bucket value previous = bucketsMAX[i]; } maxGap = Math.max(maxGap, max - previous); // 更新最大间隔 return maxGap; } }
参考:https://www.cnblogs.com/grandyang/p/4234970.html