news 2026/5/24 21:26:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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("所有测试用例通过!")

总结

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 21:23:53

明日方舟游戏素材开源项目:开发者与创作者的一站式资源宝库

明日方舟游戏素材开源项目&#xff1a;开发者与创作者的一站式资源宝库 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 还在为明日方舟游戏素材的获取而烦恼吗&#xff1f;无论是开发游…

作者头像 李华
网站建设 2026/5/24 21:19:19

Ghostwriter 组织定向钓鱼攻击技术分析与防御体系研究

摘要&#xff1a;2026 年 3 月起&#xff0c;与白俄罗斯情报体系关联的 APT 组织 Ghostwriter&#xff08;亦称 FrostyNeighbor、UAC‑0057、UNC1151&#xff09;针对乌克兰政府机构发动两轮高精度网络间谍行动&#xff0c;综合运用地理围栏过滤、仿冒政务场景诱饵、多级混淆载…

作者头像 李华
网站建设 2026/5/24 21:11:13

通过curl命令快速测试Taotoken大模型API接口是否通畅

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型API接口是否通畅 基础教程类&#xff0c;针对需要在无SDK环境或进行快速接口验证的开发者&…

作者头像 李华
网站建设 2026/5/24 21:04:06

量子几何机器学习:灰盒模型在量子门合成中的原理与实践

1. 项目概述&#xff1a;当机器学习遇见量子几何在量子计算领域&#xff0c;一个核心的工程挑战是如何高效、高保真地合成我们想要的量子门操作。你可以把量子门想象成对量子比特进行精确旋转和操作的“指令”。传统上&#xff0c;这依赖于复杂的物理模型和数值优化算法来求解控…

作者头像 李华
网站建设 2026/5/24 20:54:24

单晶多晶的电子衍射标定

一&#xff0c;单晶与多晶 但无论怎样&#xff0c;实际情况和这些书中讲得总是有这样那样的不同&#xff0c;那么下面就具体几个知识点稍微讲一下电子衍射分析吧。 对于单晶和多晶的判定&#xff1a; 对于单晶和多晶的区分&#xff0c;这里面容易弄混的几个概念是&#xff1…

作者头像 李华