给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
- 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
- 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
示例
示例一
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例二
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
思路
看到数组元素全部为非负整数以及线性时间复杂度的排序就想到了桶排序。桶排序简单来说就是把元素根据大小在一次遍历中放到对应的桶中。之后将每个桶中的元素依次取出组成排序后的数组。可参考桶排序(箱排序)原理及其时间复杂度详解中的图解:
但桶排序的问题也较为明显:在资源分布不均匀时会占用大量的空间,他的空间复杂度是O(m),其中m位桶的个数。
所以在此题中,我们能不能直接通过桶排序并计算最大的连续空桶数呢?代码如下:
def maximumGap(self, nums) -> int:
if len(nums)<2:
return 0
# 初始化桶,桶的个数为数组中最大值
buckets = [0]*(max(nums)+1)
# 把数字放入对应的桶中
for num