题目
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序
示例
原数组:{4,3,9,6}
排序后数组:{3,4,6,9}
,则相邻两数最大差值为9 - 6 = 3
思路
1.设数组中有N个数,则准备N+1个桶,每个桶对应一个范围(这个范围稍后说明),桶中存放对应范围内的最大值和最小值,以及一个判断是否为空桶的标记
2.遍历整个数组找到整个数组的min和max分别放入0号桶和N号桶,若max == min 则return 0
3.把min到max的范围等分为N份,而原数组中的值属于哪个范围就放在哪个桶中
我们有N个数和N+1个桶,由此可以推出至少会存在一个空桶,下面来说说空桶的意义。
空桶的意义
空桶的左右两侧迟早会有非空的桶,而这两个非空桶之间的差值必然是大于一个桶的范围的,这样我们就可以排除同一个桶内的差值为最大差值的情况了。
换句话说,最大差值肯定比一个桶的范围大了,那你讨论一个桶内有什么意义呢
回想前面,我们只需要存放对应范围内的最大值和最小值到一个桶中即可,就是因为最大差值必然是在两个相邻的非空桶之间的,我们只需要计算两个相邻的非空桶之间(中间允许有空桶)的最大值和最小值的差,那些情况才有可能是最大差值。
有兄弟萌也许会想直接找空桶两侧的最大差值,但这是不行的,我们只是排除了单个桶内的情况,其他情况我们依旧需要计算。可以看个反例
下面来看下实际代码:
1 | public static int maxGap(int [] nums) { |