news 2026/4/23 23:26:57

【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/4/17 23:27:57

3步解锁音乐格式限制:ncmdump让你的收藏重获自由

当你精心收藏的网易云音乐只能被特定播放器识别时&#xff0c;是否曾感到无奈&#xff1f;ncmdump音频转换工具正是为打破这一限制而生&#xff0c;通过音乐格式转换技术&#xff0c;让每一首歌曲都能在任意设备上自由播放。 【免费下载链接】ncmdump 项目地址: https://git…

作者头像 李华
网站建设 2026/4/22 11:14:27

TranslucentTB深度体验:打造Windows任务栏的透明艺术

你是否曾经对着单调的Windows任务栏感到审美疲劳&#xff1f;当桌面壁纸美轮美奂&#xff0c;而任务栏却像个固执的黑色边框&#xff0c;破坏了整体的视觉和谐。TranslucentTB正是为打破这种视觉隔阂而生&#xff0c;它让任务栏从生硬的边界变成了灵动的视觉元素。 【免费下载链…

作者头像 李华
网站建设 2026/4/22 14:27:49

智慧树刷课终极方案:解放双手的全自动学习革命

智慧树刷课终极方案&#xff1a;解放双手的全自动学习革命 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树网课的手动操作而烦恼吗&#xff1f;每次都要盯…

作者头像 李华
网站建设 2026/4/23 17:06:56

终极B站视频下载指南:专业级超高清内容获取完整方案

B站视频下载工具DownKyi为内容创作者和视频爱好者提供了完美的解决方案&#xff0c;支持从标清到8K超高清的全画质解析&#xff0c;集成批量下载、音视频提取、去水印等实用功能&#xff0c;让高质量视频获取变得简单高效。&#x1f60a; 【免费下载链接】downkyi 哔哩下载姬do…

作者头像 李华
网站建设 2026/4/21 0:41:13

RVC语音转换终极指南:从快速入门到专业配置

检索式语音转换&#xff08;RVC&#xff09;技术通过智能Web界面实现高质量声音特征迁移&#xff0c;本指南将带你从零开始掌握核心操作与深度优化技巧。 【免费下载链接】rvc-webui liujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: htt…

作者头像 李华
网站建设 2026/4/15 10:40:01

飞书文档批量导出神器:一键迁移海量文档的终极方案

飞书文档批量导出神器&#xff1a;一键迁移海量文档的终极方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 还在为飞书文档迁移而烦恼吗&#xff1f;面对团队知识库和个人工作空间中的大量文档&#xff0c;手动…

作者头像 李华