给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:
你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-gap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种思路:
如果没有要求线性时间复杂度,那么很简单,直接排序然后遍历排序后的数组即可。
class Solution(object):
def maximumGap(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) < 2:
return 0
nums.sort()
res = 0
for i, num in enumerate(nums):
if i > 0:
res = max(res, num - nums[i - 1])
return res
第二种思路:
要处理线性复杂度的排序,可以用桶排序。
开三个数组,exist, max_num, min_num分别表示一个桶是否为空,桶里元素的最大值和桶里元素的最小值,
将nums里的每个数映射入桶之后,找到相邻两个非空桶的最大最小值之差。
class Solution(object):
def maximumGap(self, nums):
if len(nums) < 2:
return 0
min_val, max_val = min(nums), max(nums)
if min_val == max_val:
return 0
n = len(nums) + 1 # 桶的个数
step = (max_val - min_val) // n
exist = [0 for _ in range(n + 1)] #表示桶是否为空
max_num = [0 for _ in range(n + 1)]#表示桶里元素的最大值
min_num = [0 for _ in range(n + 1)]#表示桶离元素的最小值
for num in nums: #把所有的数入桶
idx = self.findBucketIndex(num, min_val, max_val, n)
max_num[idx] = num if not exist[idx] else max(num, max_num[idx])
min_num[idx] = num if not exist[idx] else min(num, min_num[idx])
exist[idx] = 1
res = 0
pre = max_num[0]
for i in range(1, n + 1):
if exist[i]:
res = max(res, min_num[i] - pre)
pre = max_num[i]
return res
def findBucketIndex(self, num, min_val, max_val, n):
return int((num - min_val) * n / (max_val - min_val))