当前位置: 首页 > news >正文

LeetCode 164:最大间距 | 桶排序与鸽巢原理

LeetCode 164:最大间距 | 桶排序与鸽巢原理

引言

最大间距(Maximum Gap)是 LeetCode 第 164 题,难度为 Hard。题目要求在未排序的数组中找到排序后相邻元素之间的最大差值,要求使用线性时间复杂度和 O(n) 空间复杂度。

这道题不能使用简单的排序,因为要求线性时间。解决方案基于桶排序和鸽巢原理:首先找到最大值和最小值,确定桶的大小,然后使用桶来记录每个桶内的最小值和最大值。

问题分析

题目描述

给定未排序数组 nums,返回排序后相邻元素之间的最大差值。如果数组元素少于 2 个,返回 0。

问题特点

要求线性时间复杂度和 O(n) 空间复杂度,普通的排序算法(如快速排序)不满足要求。需要使用桶排序。

解决方案

桶排序方法

def maximumGap(nums): if len(nums) < 2: return 0 min_val = min(nums) max_val = max(nums) if min_val == max_val: return 0 bucket_size = (max_val - min_val) // (len(nums) - 1) if bucket_size == 0: bucket_size = 1 bucket_num = (max_val - min_val) // bucket_size + 1 buckets = [[float('inf'), float('-inf')] for _ in range(bucket_num)] for num in nums: idx = (num - min_val) // bucket_size buckets[idx][0] = min(buckets[idx][0], num) buckets[idx][1] = max(buckets[idx][1], num) max_gap = 0 previous_max = min_val for bucket_min, bucket_max in buckets: if bucket_min == float('inf'): continue max_gap = max(max_gap, bucket_min - previous_max) previous_max = bucket_max return max_gap

算法详解

  1. 找到数组的最小值和最大值
  2. 计算桶大小:bucket_size = (max - min) / (n - 1)
  3. 将元素放入对应的桶中,记录每个桶的最小值和最大值
  4. 遍历所有桶,计算相邻非空桶的最大差值

鸽巢原理

根据鸽巢原理,n 个数放入 n-1 个桶后,至少有一个桶是空的。最大间距一定大于等于桶大小,且只可能出现在非空桶之间。

复杂度分析

时间复杂度

时间复杂度为 O(n),因为只需要常数次遍历。

空间复杂度

空间复杂度为 O(n),用于存储桶。

代码实现

Python 实现

def maximumGap(nums): if len(nums) < 2: return 0 min_val = min(nums) max_val = max(nums) if min_val == max_val: return 0 n = len(nums) bucket_size = max(1, (max_val - min_val) // (n - 1)) bucket_count = (max_val - min_val) // bucket_size + 1 buckets = [[float('inf'), float('-inf')] for _ in range(bucket_count)] for num in nums: idx = (num - min_val) // bucket_size buckets[idx][0] = min(buckets[idx][0], num) buckets[idx][1] = max(buckets[idx][1], num) max_gap = 0 previous_max = min_val for bucket_min, bucket_max in buckets: if bucket_min == float('inf'): continue max_gap = max(max_gap, bucket_min - previous_max) previous_max = bucket_max return max_gap

测试用例

def test_maximum_gap(): assert maximumGap([3, 6, 9, 1]) == 3 assert maximumGap([10]) == 0 assert maximumGap([1, 1, 1, 1]) == 0 assert maximumGap([1, 3, 6, 9]) == 3 print("所有测试用例通过!")

总结

最大间距问题展示了桶排序和鸽巢原理的应用。通过合理设置桶大小,利用鸽巢原理保证最大间距只出现在非空桶之间,实现了线性时间复杂度的排序。

http://www.jsqmd.com/news/879729/

相关文章:

  • 2026扭力传感器十大品牌排名揭晓,广东犸力摒弃传统电刷结构实现超长免维护 - 品牌速递
  • 深圳地区值得推荐的小程序开发公司(专注企业数字化转型服务) - 软件测评师
  • 5分钟免费上手:AI换脸终极指南,用roop-unleashed创作专业级视频
  • 2026年5月甘南地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 手机自拍也能过审?2026证件照换底色以及制作全流程解析 - 科技大爆炸
  • 深入实践LIWC文本分析:从心理语言学工具到企业级应用的全栈指南
  • 2026扭力传感器品牌排行榜,广东犸力以高稳定性抗干扰能力赢得市场广泛赞誉 - 品牌速递
  • 2026年去水印在线工具怎么选?6种方法实测横评,这4款免费工具真的够用了 - 科技热点发布
  • 2026照片去水印免费软件app推荐:这4款小程序实测真香,第1款3秒搞定无损原图 - 科技热点发布
  • 2026贵阳装修公司推荐,选对不踩坑! - 资讯纵览
  • 排序算法进阶总结 | 技巧归纳与实战应用
  • 免费在线去水印软件推荐(2026保姆级教程):别让水印毁了你的好素材
  • 2026年5月甘南迭部地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 密码加密与存储完全指南
  • 2026年5月大兴安岭松岭地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 艾尔登法环存档迁移终极指南:3步安全转移你的游戏角色
  • 力扣之路03—无重复字符的最长子串 - NO
  • 2026超高压传感器品牌排名发布,广东犸力在深海探测领域展现极强长期稳定性 - 品牌速递
  • 2026抖音在线去水印怎么操作?6种方法实测对比,这4款微信小程序最靠谱 - 科技热点发布
  • 2026 海南封关红利全面释放!海南初创公司 靠谱财税代办四强推荐 - 资讯纵览
  • 安全漏洞防护完全指南
  • 3分钟掌握novel-downloader:打造你的永久小说图书馆终极指南
  • 2026年5月滁州地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 2026年5月大兴安岭塔河地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 初次使用Taotoken从注册到成功发起第一个API调用的全过程体验
  • ppt模板_0041_十一国庆主题3
  • 2026视频号视频怎么保存到相册?实测6种方法,这4款小程序几乎零失败 - 科技热点发布
  • 2026年最新测评:别人视频号里的视频怎么保存到相册?安卓/苹果手机保存方法横评 - 科技热点发布
  • 2026年5月滁州定远地区黄金回收白银铂金回收门店推荐TOP1 地址及联系方式 - 检测回收中心
  • 【审计专栏】【财务领域】【会计领域】第二十五篇 企业的收入来源和成本支出模型01 国有企业