1. 项目概述
LeetCode 164题是一道经典的算法题目,题目名为"最大间距"。这道题在算法面试中经常出现,主要考察对线性时间排序算法的理解和应用能力。题目要求给定一个无序的数组,找出数组在排序后相邻元素之间的最大差值。如果数组包含的元素少于2个,则返回0。
这道题的特殊之处在于,它要求我们在O(n)的时间复杂度内解决问题。这意味着我们不能使用常规的基于比较的排序算法(如快速排序、归并排序等),因为这些算法的时间复杂度通常是O(nlogn)。因此,这道题的核心在于如何巧妙地利用桶排序或基数排序等线性时间排序算法的思想来解决问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 问题分析与直觉解法
首先,最直观的解法是将数组排序,然后遍历排序后的数组,计算相邻元素的差值,找出最大的那个。这种方法虽然简单直接,但时间复杂度为O(nlogn),不符合题目要求的O(n)时间复杂度。
python复制def maximumGap(nums):
if len(nums) < 2:
return 0
nums.sort()
max_gap = 0
for i in range(1, len(nums)):
max_gap = max(max_gap, nums[i] - nums[i-1])
return max_gap
这个解法虽然简单,但不符合题目要求。我们需要寻找更高效的算法。
2.2 桶排序思想的应用
为了达到O(n)的时间复杂度,我们需要使用桶排序的思想。桶排序的基本思路是将元素分配到不同的"桶"中,然后对每个桶内部进行排序,最后按顺序收集所有桶中的元素。
对于这道题,我们可以利用以下关键观察:
- 最大间距不会小于⌈(max_num - min_num)/(n-1)⌉
- 因此,我们可以将元素分配到大小为⌈(max_num - min_num)/(n-1)⌉的桶中
- 最大间距只可能出现在相邻桶之间(前一个桶的最大值和后一个桶的最小值之间),而不会出现在同一个桶内部
2.3 具体实现步骤
- 首先找出数组中的最小值和最大值
- 计算桶的大小:bucket_size = max(1, (max_num - min_num) // (
