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

LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)

287. 寻找重复数 

📌 题目描述

给定一个包含 n + 1 个整数的数组 nums,其所有数字都在区间 [1, n] 范围内(包含 1 和 n)。由于数组中包含 n + 1 个数,而数的取值范围只有 n 个,因此至少存在一个重复的数

请你返回这个唯一重复的数

❗ 限制条件

  • 不能修改数组(不能排序或哈希)

  • 只使用常量级空间(不能使用额外的集合)

  • 时间复杂度 < O(n²),理想为 O(n)

🧠 解法:快慢指针(Floyd 判圈算法)

我们将数组视为一个链表,数组的下标是链表的节点编号,元素值是链表的“指针”——即跳转的位置。

例如:nums = [1, 3, 4, 2, 2]
可看作链表:
0 → 1 → 3 → 2 → 4 → 2 → 4 → 2 → ...重复数字造成了“环”,问题转换为:**找环的入口**

✅ Floyd 算法分两步:

第一步:快慢指针相遇(找环中某个点)
slow = nums[0]
fast = nums[0]# 快走两步,慢走一步
while True:slow = nums[slow]fast = nums[nums[fast]]if slow == fast:break

第二步:从起点再来一次,寻找环的起点(即重复数字) 

slow = nums[0]
while slow != fast:slow = nums[slow]fast = nums[fast]

此时 slow == fast 即为环的入口,也就是重复数字。 

✅ 完整代码 

class Solution:def findDuplicate(self, nums: List[int]) -> int:# 第一步:快慢指针相遇slow = nums[0]fast = nums[0]while True:slow = nums[slow]fast = nums[nums[fast]]if slow == fast:break# 第二步:找环的入口slow = nums[0]while slow != fast:slow = nums[slow]fast = nums[fast]return slow

⏱️ 时间复杂度与空间复杂度分析 

指标说明
⏱️ 时间复杂度O(n),快慢指针最多跑两轮链表
💾 空间复杂度O(1),只用了几个变量

📌 总结

  • 不能修改原数组 ➜ 排除排序、计数等解法

  • 要求 O(1) 空间 ➜ 排除哈希表

  • 使用链表快慢指针 ➜ 经典技巧,空间压缩到极致!

 

http://www.lryc.cn/news/581773.html

相关文章:

  • Android studio升级AGP需要注意哪些
  • 编程基础:继承
  • Modbus_TCP_V5 新功能
  • C++之路:多态与虚函数
  • 在phpstudy环境下配置搭建XDEBUG配合PHPSTORM的调试环境
  • 【Bluedroid】蓝牙 GATT 客户端注册机制与流程详解(BTA_GATTC_AppRegister)
  • Solidity——pure 不消耗gas的情况、call和sendTransaction区别
  • 【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
  • Node.js特训专栏-实战进阶:13. ORM/ODM工具选型与使用
  • AI做美观PPT:3步流程+工具测评+避坑指南
  • 【论文笔记】【强化微调】Pixel Reasoner:早期 tool call 的调用
  • CppCon 2018 学习:Undefined Behavior is Not an Error
  • 【系统分析师】2022年真题:论文及解题思路
  • (二) TDOA(到达时间差)、AoA(到达角度)、RSSI(接收信号强度)、TOF(飞行时间) 四种定位技术的原理详解及对比
  • 手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)
  • 从前端转go开发的学习路线
  • 2025 BSidesMumbaiCTF re 部分wp
  • NLP文本预处理
  • Spring AI(12)——调用多模态模型识别和生成图像
  • MyBatis实战指南(九)MyBatis+JSP+MySQL 前端页面实现数据库的增加与删除显示数据
  • 分布式会话的演进和最佳事件,含springBoot 实现(Java版本)
  • 【网络安全】不要在 XSS 中使用 alert(1)
  • 电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测,附锂电池最新文章汇集
  • 一个简单的脚本,让pdf开启夜间模式
  • 【STM32】通用定时器PWM
  • 李宏毅NLP-8-语音模型
  • 20250706-11-Docker快速入门(下)-构建Nginx镜像和Tomcat镜像_笔记
  • Kotlin lazy 委托的底层实现原理
  • styled-components:现代React样式解决方案
  • 构建下一代智能应用:RAG系统开发深度指南