news 2026/9/3 0:22:34

【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/2 23:33:12

网盘下载加速终极指南:3分钟掌握直链提取神器

网盘下载加速终极指南&#xff1a;3分钟掌握直链提取神器 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度慢如蜗牛而烦恼吗&#xff1f;现在&#xff0c;一个简单易用的免费…

作者头像 李华
网站建设 2026/8/28 7:25:57

LAV Filters视频解码器:5分钟掌握全格式播放解决方案

LAV Filters视频解码器&#xff1a;5分钟掌握全格式播放解决方案 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 还在为不同视频格式的兼容性问题困扰吗&…

作者头像 李华
网站建设 2026/9/3 0:21:28

手把手教你用UDS 31服务激活特定诊断例程

手把手教你用UDS 31服务激活特定诊断例程&#xff1a;从原理到实战你有没有遇到过这样的场景&#xff1f;OTA升级前需要关闭看门狗、产线上要自动触发电机自检、售后维修时得重置ECU的学习值……这些操作看似简单&#xff0c;但如果靠改代码或手动调试&#xff0c;效率低还容易…

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

Python Flask轻量API封装:快速搭建CosyVoice3后端服务原型

Python Flask轻量API封装&#xff1a;快速搭建CosyVoice3后端服务原型 在短视频、虚拟主播和个性化语音助手日益普及的今天&#xff0c;如何让一个强大的语音合成模型真正“用起来”&#xff0c;而不仅仅是跑通命令行脚本&#xff1f;这是许多AI开发者面临的现实挑战。阿里开源…

作者头像 李华
网站建设 2026/9/2 23:32:18

工业控制场景下Protel99SE软件部署从零实现

如何在现代Windows系统中成功部署Protel99SE&#xff1f;一位老工程师的实战手记最近接到一个任务&#xff1a;为某工厂升级一套老旧的PLC控制系统。客户明确要求——所有电路图必须用Protel99SE设计&#xff0c;因为他们的归档系统只认.ddb文件格式。你没听错&#xff0c;是那…

作者头像 李华
网站建设 2026/8/31 22:52:59

3大核心技术原理与实用指南:深度解析内容访问辅助工具

3大核心技术原理与实用指南&#xff1a;深度解析内容访问辅助工具 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在现代信息获取环境中&#xff0c;内容访问辅助工具已成为突破内容限…

作者头像 李华