news 2026/9/6 17:41:45

【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/9/3 2:13:25

Notch实时图形引擎:舞台演出中动态调用CosyVoice3语音特效

Notch与CosyVoice3融合&#xff1a;语音驱动舞台视觉的新范式 在一场虚拟偶像的跨年演唱会上&#xff0c;主持人临时决定用四川话和粉丝互动。无需提前录制&#xff0c;运营人员仅在控制台输入一句文本并选择“川普兴奋”风格——3秒后&#xff0c;带口音的语音自动生成&#x…

作者头像 李华
网站建设 2026/9/5 9:16:53

智慧树学习助手:3步实现高效学习与灵活进度

智慧树学习助手&#xff1a;3步实现高效学习与灵活进度 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树网课的繁琐操作而烦恼吗&#xff1f;这款智慧树学习…

作者头像 李华
网站建设 2026/9/3 2:13:25

显卡配置优化大师:NVIDIA Profile Inspector 完全掌控指南

显卡配置优化大师&#xff1a;NVIDIA Profile Inspector 完全掌控指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想要彻底掌控你的NVIDIA显卡性能吗&#xff1f;NVIDIA Profile Inspector就是你的…

作者头像 李华
网站建设 2026/9/6 13:10:56

Boss直聘自动化求职神器:3步搞定高效批量投递终极指南

还在为求职过程中的重复劳动而烦恼吗&#xff1f;每天花费大量时间手动投递简历&#xff0c;效果却不尽如人意&#xff1f;Boss直聘自动化求职工具正是你需要的智能助手&#xff01;这款完全免费的自动化脚本能够在几分钟内完成上百份简历的精准投递&#xff0c;彻底解放你的双…

作者头像 李华
网站建设 2026/9/3 2:13:36

3大核心功能深度解析:LeagueAkari如何让英雄联盟玩家效率翻倍

3大核心功能深度解析&#xff1a;LeagueAkari如何让英雄联盟玩家效率翻倍 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还…

作者头像 李华