news 2026/2/22 16:58:04

【LeetCode刷题】寻找重复数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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 <=
  • nums.length == n + 1
  • 1 <= nums[i] <= n
  • nums只有一个整数出现两次或多次,其余整数均只出现一次

算法解析:

  1. 构建链表逻辑:把数组的索引看作链表节点,元素值看作下一个节点的索引(因数组元素范围是[1,n],不会越界)。由于存在重复数,链表会形成,重复数就是环的入口节点

  2. 快慢指针找环

    • 慢指针slow每次走 1 步,快指针fast每次走 2 步,最终会在环内某点相遇。
  3. 找环的入口

    • 从数组起点(nums[0])和环内相遇点,同时出发两个指针(每次走 1 步),相遇处即为环的入口,也就是重复的数。

示例验证

nums = [1,3,4,2,2]为例:

  • 链表结构:0 → 1 → 3 → 2 → 4 → 2(环的入口是2)。
  • 快慢指针相遇后,起点指针与慢指针会在2处相遇,返回结果2

Python代码:

from typing import List class Solution: """ 寻找数组中重复的数字(满足条件:数组长度n+1,元素范围[1,n],仅一个重复数,可能重复多次) 核心算法:快慢指针(弗洛伊德环检测),时间复杂度O(n),空间复杂度O(1),不修改原数组 """ def findDuplicate(self, nums: List[int]) -> int: """ 查找数组中重复的数字 :param nums: 输入数组,长度为n+1,元素范围[1,n],保证有且仅有一个数字重复 :return: 重复的数字 """ # 边界校验:数组长度小于2时无意义(题目保证输入合法,此处为鲁棒性补充) if len(nums) < 2: raise ValueError("数组长度至少为2") # 1. 快慢指针找环内相遇点(慢指针走1步,快指针走2步) slow = nums[0] fast = nums[0] while True: slow = nums[slow] # 慢指针:每次走1步 fast = nums[nums[fast]] # 快指针:每次走2步 if slow == fast: # 快慢指针相遇,说明存在环,退出循环 break # 2. 找环的入口(重复数就是环的入口) # 原理:从数组起点和相遇点同时出发,每次走1步,相遇处即为环入口 ptr = nums[0] # 指针1:从数组起点出发 while ptr != slow: ptr = nums[ptr] # 指针1走1步 slow = nums[slow] # 指针2(原慢指针)走1步 return ptr # -------------------------- 测试用例 -------------------------- if __name__ == "__main__": solution = Solution() # 测试用例1:基础情况 nums1 = [1, 3, 4, 2, 2] print(f"测试用例1: {nums1} → 重复数:{solution.findDuplicate(nums1)}") # 预期输出:2 # 测试用例2:重复数在开头 nums2 = [2, 2, 2, 2, 2] print(f"测试用例2: {nums2} → 重复数:{solution.findDuplicate(nums2)}") # 预期输出:2 # 测试用例3:最小边界(数组长度2) nums3 = [1, 1] print(f"测试用例3: {nums3} → 重复数:{solution.findDuplicate(nums3)}") # 预期输出:1 # 测试用例4:重复数在中间 nums4 = [3, 1, 3, 4, 2] print(f"测试用例4: {nums4} → 重复数:{solution.findDuplicate(nums4)}") # 预期输出:3

LeetCode提交代码:

class Solution: def findDuplicate(self, nums: List[int]) -> int: # 1. 快慢指针找环内相遇点 slow = nums[0] fast = nums[0] while True: slow = nums[slow] fast = nums[nums[fast]] if slow == fast: break # 2. 找环的入口(即重复数) ptr = nums[0] while ptr != slow: ptr = nums[ptr] slow = nums[slow] return ptr

程序运行截图展示

总结
题目要求在长度为n+1的数组中找到唯一重复的数字(元素范围[1,n]),要求不修改数组且使用O(1)空间。通过将数组视为链表(索引为节点,值为下一节点),利用快慢指针检测环:

  1. 找环:快指针(每次2步)与慢指针(每次1步)相遇;
  2. 找入口:从起点和相遇点同步移动,相遇点即为重复数。
    示例[1,3,4,2,2]中,链表形成环2→4→2,入口2即为解。算法时间复杂度O(n),空间O(1)。Python代码通过双指针实现,已验证边界用例。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 15:55:55

NCM文件转换终极指南:3种方法让你轻松解密网易云音乐

NCM文件转换终极指南&#xff1a;3种方法让你轻松解密网易云音乐 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他播放器上播放而烦恼吗&#xff1f;别担心&#xff0c;这份NCM文件转换指…

作者头像 李华
网站建设 2026/2/18 3:04:27

HsMod终极指南:3步实现炉石传说32倍速游戏体验

还在为炉石传说的日常任务耗时过长而烦恼吗&#xff1f;这款基于BepInEx框架的HsMod插件正是你需要的游戏加速神器。通过智能优化和个性化定制功能&#xff0c;它能让你的游戏效率提升数倍&#xff0c;同时打造专属的游戏界面。 【免费下载链接】HsMod Hearthstone Modify Base…

作者头像 李华
网站建设 2026/2/22 16:56:47

B站视频语音智能转文字工具使用全攻略

B站视频语音智能转文字工具使用全攻略 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为视频内容整理而耗费大量时间吗&#xff1f;想要快速将B站视频中的…

作者头像 李华
网站建设 2026/2/13 14:41:06

飞书文档批量导出终极教程:3分钟搞定团队知识迁移

还在为海量飞书文档的迁移备份而烦恼吗&#xff1f;面对团队知识库中的数百个文档&#xff0c;手动逐个导出不仅效率低下&#xff0c;还容易出错遗漏。现在&#xff0c;通过飞书文档批量导出工具&#xff0c;您可以在极短时间内完成整个知识库的自动化迁移&#xff0c;完美保持…

作者头像 李华
网站建设 2026/2/19 20:49:53

RimSort:彻底革新《环世界》模组管理的智能解决方案

RimSort&#xff1a;彻底革新《环世界》模组管理的智能解决方案 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 还在为《环世界》模组加载顺序而烦恼吗&#xff1f;面对数百个模组&#xff0c;你是否曾因游戏崩溃而浪费数小时排查问题…

作者头像 李华
网站建设 2026/2/21 8:19:08

TranslucentTB终极美化指南:5分钟让Windows任务栏焕然一新

TranslucentTB终极美化指南&#xff1a;5分钟让Windows任务栏焕然一新 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB 想要为枯燥的Windows任务栏注入全新活力吗&#xff1f;TranslucentTB正是你需要的完美解决方案。这款…

作者头像 李华