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

力扣287-寻找重复数

287. 寻找重复数 - 力扣(LeetCode)

给定一个包含n + 1个整数的数组nums,其数字都在[1, n]范围内(包括1n),可知至少存在一个重复的整数。

假设nums只有一个重复的整数,返回这个重复的数

你设计的解决方案必须不修改数组nums且只用常量级O(1)的额外空间。

示例 1:

输入:nums =[1,3,4,2,2]
输出:2

示例 2:

输入:nums =[3,1,3,4,2]
输出:3

示例 3 :

输入:nums =[3,3,3,3,3]
输出:3

提示:

  • 1 <= n <= 105
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • nums只有一个整数出现两次或多次,其余整数均只出现一次

进阶:

  • 如何证明nums中至少存在一个重复的数字?
  • 你可以设计一个线性级时间复杂度O(n)的解决方案吗?

对 i=0,1,2,…,n,连一条从 i 到nums[i]的有向边,得到一个有向图

每个节点的入度,都表示这个节点在 nums 中的出现次数

以示例一的[1, 3, 4, 2, 2]为例

因为2出现了两次,下标分别为3和4,所以一定会有 3 -> 2 和 4 -> 2 两条边,2 的入度就是它出现的次数

严谨地说,假设nums[i] == nums[j] == k,即 k 为那个重复出现的数,那么就必然建立 i -> k 和 j -> k 两条边

由于每个节点的出度都为1(因为下标唯一),所以 n + 1 个节点有 n + 1 条边,这样的有向图必然有环,找到环的入口即可

注意,可能有多个连通块,例如[1, 2, 1, 4, 3]中,3 和 4 是互相指向的,两个节点构成一个连通块。因此要从节点 0 出发寻找

那么问题就变成了找链表中环开始的节点,使用 Floyd 判圈算法,其实就是快慢指针

假设头节点到入环口要走 a 步,环长为 b,相遇时慢指针走了 c 步,那么快指针走了 2c 步,设快指针比慢指针多走了 k 圈,则有:2c - c = kb,即 c = kb

慢指针从入环口开始,在环中走了 c - a = kb - a 步到达相遇点

对于快指针,从入环口开始,在环中走了 2kb - a 步到达相遇点

那么如果同时让快慢指针再走 a 步,慢指针从入环口开始在环中走了 kb 步,快指针则是 2kb 步,而环长为 b,所以此时慢指针从入环口开始走了 k 圈,快指针 2k 圈,刚好为整数,意味着相遇点再走 a 步,就是入环口

也就是说,相遇后,我们可以让一个新指针从头节点出发,让慢指针从相遇点出发,二者相遇的点就是入环口。因为慢指针差 a 步到相遇点,而 a 的含义就是头节点到入环口的步数

class Solution { public int findDuplicate(int[] nums) { int slow = 0, fast = 0; // 0必定不在环上,因为入度为0 while(true) { slow = nums[slow]; // slow = slow.next fast = nums[nums[fast]]; // fast = fast.next.next if(fast == slow) { break; } } int head = 0; while(slow != head) { slow = nums[slow]; head = nums[head]; } return slow; } }
http://www.jsqmd.com/news/1221327/

相关文章:

  • SecretAgent API参考:掌握高效网页抓取的关键接口
  • 2026 合肥二手奢侈包行情看涨,包河区易奢福鉴定师支招:别清洗!原汁原味反而卖得高 - 奢侈品回收实体店
  • 2026泰州黄金回收避坑指南:认准这五家正规黄金回收商家 - 商业信息快查
  • 鸿蒙原生开发手记:徒步迹 - 健康数据展示页面
  • AI Agent 工程化实战:从原型到生产级智能体的完整路径
  • BepInEx深度解析:跨平台Unity插件框架架构设计与性能优化
  • 长沙芙蓉区文艺路街道亨得利官方名表服务中心电话公示(2026年7月最新) - 亨得利官方
  • 2026金华黄金回收全攻略:九大门店全覆盖,六大套路彻底拆解,本地变现优选 - 资讯纵览
  • 应收账款账期
  • GitHub开源项目 odysseus 深度评测:自托管多智能体协作平台的架构与安全边界
  • Windows微信批量消息发送工具:三步搞定群发难题的智能助手
  • 深度解析:当测试遇见现代化开发——从 pytest 的流行看软件质量保障的演变
  • 半导体mes厂家的封测MES系统OEE计算模型与设备稼动率分析方法
  • 2026镇江黄金回收哪家门店靠谱?精选六家全流程透明的回收好店 - 商业信息快查
  • LangChain 与 LangGraph 实战:构建可编排的大模型智能应用
  • 探秘北京不锈钢防火门技术领先厂家:甄别标准与优铂门窗案例解析 - 星泽吖
  • 保研文书急救包:2024计算机预推免个人陈述与推荐信模板全攻略
  • 南充黄金回收防坑手册:从识别光谱仪到守住克重,五家正规门店的透明法则全公开 - 小城生活闲谈
  • 数学公式OCR实战:从图片到LaTeX的高效转换方案
  • Loop窗口管理框架:面向开发者的macOS生产力工具设计与实现
  • 压箱底的三金断了也不怕!2026 合肥包河区易奢福高价回收,不论品牌新旧一律按实时金价结算 - 奢侈品回收实体店
  • Seedance 2.0 vs 可灵 3.0:2026年终极AI视频横评
  • Ansible for Kubernetes性能优化:如何加速Kubernetes集群的构建和部署过程
  • 快速开始kafka-storm-starter:5分钟搭建流处理开发环境
  • 2026建站+GEO优化公司推荐,含零代码SAAS、AI编程、源码定制
  • 【VR】 A CLIP-Hitchhiker’s Guide to Long Video Retrieval
  • 2026牛客暑期多校训练营1部分题解, 补题
  • 武汉助产学校校园管理与办学配套招生简章 - 升学择校早知道
  • 如何通过Wand-Enhancer实现WeMod本地功能增强与远程控制
  • 目前天津高三复读班有哪些可以报名 - 资讯速览