题目描述:给定一个整型数组arr,返回排序后相邻两数的最大差值。
输入样例:[1,4,3,6,5]
输出样例:2
解题思路:
-
思想来自于桶排序;
-
先遍历数组,找到最小值Min和最大值Max;
-
在Min和Max范围内(例如:Min = 1,Max = 9,则区间为[1,9),9为开区间),等量分为n个区间(n为数组长度);
-
每个区间对应一个桶,每个数根据自己的区间选择对应的桶,最大值单独放到n号桶中,则0号桶和n号桶必定有元素;
-
同一个桶中的元素差值不会大于桶区间,相邻桶间的差值不会小于桶区间内,空桶(没放任何元素的桶)两侧桶中元素的差值必定大于同一个桶中的,所以不用考虑同一个桶的相邻数;
-
只考虑当前桶的最小值减去前一个不为空桶的桶的最大值,其中的最大值为题解。
-
时间复杂度O(N),空间复杂度O(N)。
Java的实现代码:
public int findMaxDiff(int[] arr) { int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { min = Math.min(min, arr[i]); max = Math.max(max, arr[i]); } //记录每个桶的最大值和最小值 int[] bucketMax = new int[arr.length + 1]; int[] bucketMin = new int[arr.length + 1]; //记录桶是否有元素 boolean[] hasNum = new boolean[arr.length + 1]; //遍历确定每个桶的最大最小值 for (int i = 0; i < arr.length; i++) { //确定元素桶号 int bucket = (arr[i] - min) * arr.length / (max - min); bucketMax[bucket] = hasNum[bucket] ? Math.max(bucketMax[bucket], arr[i]) : arr[i]; bucketMin[bucket] = hasNum[bucket] ? Math.min(bucketMin[bucket], arr[i]) : arr[i]; hasNum[bucket] = true; } //前一个桶的最大值 int perMax = bucketMax[0]; int res = 0; for (int i = 0; i < arr.length + 1; i++) { if (hasNum[i]) { res = Math.max(bucketMin[i] - perMax, res); perMax = bucketMax[i]; } } return res; }
参考https://blog.youkuaiyun.com/li563868273/article/details/50495534