题目概述
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Return 0 if the array contains less than 2 elements.
Example 1:
1 | Input: [3,6,9,1] |
Example 2:
1 | Input: [10] |
Note:
- You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
- Try to solve it in linear time/space.
本题最难的地方就是要求时间和空间复杂度都为O(n)
所以本题的思路就是使用桶排序,因为这是一种时间复杂度和空间复杂度都为O(n)的排序算法。但是本题要求的不仅是排序,还需要算出数与数之间最大的Gap。
参考了网上的一些做法后,我也逐渐理清了思路。
首先,这个最大gap的值,不可能小于(maxNum-minNum)/size的值,其中maxNum和minNum为数组中的最大值和最小值,而size则为输入的数组大小。
考虑到这点,我们就可以用size+1个桶来存放nums中的所有数字。每个桶的大小为(maxNum-minNum)/size,存放的桶的索引值则为(i-minNum)/size。这样,我们就只需要找到每个桶的最大值和最小值,并且来比较桶与桶之间的最大Gap,这个最大Gap就是整个数组的最大Gap。(因为桶内的两个数的最大Gap不可能成为全局最大Gap)
由于不需要进行数与数之间的比较,本算法的时间复杂度和空间复杂度都是线性的。
代码实现
1 | class Solution { |