Q:给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
(请尝试在线性时间复杂度和空间复杂度的条件下解决此问题)
input:6 12 2 4 3 17 11 5 10
output:5
思路分析
- 先sort然后一次遍历,虽然简单直观但显然不满足O(n)
- 排序如何才能降到O(n)呢?桶排序,用空间换时间!
- 桶排序的两个经典问题:桶的宽度是多少?有多少个桶?似乎遇到了瓶颈。
深入理解
想象一下,长度为(max−min)(max-min)(max−min)的直线上有N个点,假设,取最极端的情况——所有点在直线上均匀分布,即相邻两点之间的距离为[(max−min)/(N−1)][(max - min) / (N - 1)][(max−min)/(N−1)]
注意!这些均匀分布点,只要有一个点不老实发生了偏移,必然会导致出现一个比上面的距离更大的相邻间距(一定是一个距离减小,另一个增大)
再看看上面的数字,显然不是老老实实等距分布的。那么,我们所要寻找的「最大间距」,必然是大于理想的「均匀间距」的
我们就取「桶的宽度」为这个理想的均匀间距,并结合长度(max−min)(max-min)(max−min)就能轻易得到「桶的个数」。为什么这样取呢?
这样可以保证,最大间距一定出现在桶之间,而绝不会出现在桶内部 —— 这句话是本算法的灵魂
细节
- 桶的宽度 d = (max−min)/(N−1)(max - min) / (N - 1)(max