【Golang】LeetCode 287. 寻找重复数

287. 寻找重复数

我发现每当我隔一段时间不刷题,都会重新开始一次 Hot 100。但每一次刷完前 60 ~ 70 题就又懈怠了,导致前面大部分题目我已经刷过很多次,而后面的题目只刷过一次(幸存者偏差)。所以这一次重新开始刷题,我准备从后往前刷。

LeetCode 第 287 题是 Hot 100 的最后一道题,也就是「寻找重复数」。

题目描述

思路

题目中已经明确提到,这个数组包含n+1个整数,并且每个数的范围都在[1, n]内,并且明确提到至少存在一个重复的整数。因此,我们可以使用「Floyd 判圈算法」来解决这道题。

Hot 100 当中的链表部分有两道题,分别是「环形链表」和「环形链表 II」,这道题实际上就是「判断环形链表入口」的应用。

具体来说,我们可以将输入数组nums看作是一个链表,数组当中的每一个下标位置就是链表的节点,而下标对应的值就是链表中下一个节点的索引(Next)。我们首先设置slow := nums[0]以及fast := nums[0],然后通过快慢指针的思路找到slow == fast的位置。再然后,我们使用「环形链表 II」当中 Floyd 判圈算法的思路,令slow = nums[0],然后slowfast指针同时在链表当中向后移动,直到二者相等,这个位置就是环形链表的入口,也就是重复数。

从图示当中不难看出,节点24之间构成了环,最终找到环的入口,就是2,也就是那个重复的数字。

Golang 题解

go 复制代码
func findDuplicate(nums []int) int {
    slow := nums[0]
    fast := nums[0]

    for {
        slow = nums[slow]
        fast = nums[nums[fast]]

        if slow == fast {
            break
        }
    }

    slow = nums[0]
    for slow != fast {
        slow = nums[slow]
        fast = nums[fast]
    }

    return slow
}
相关推荐
Forever Nore3 小时前
LeetCode 14 最长公共前缀 - 纵向扫描
linux·服务器·leetcode
圣保罗的大教堂3 小时前
leetcode 3090. 每个字符最多出现两次的最长子字符串 简单
leetcode
格林威3 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
djjjx.3 小时前
【 C++ 】多态
开发语言·c++·多态
夜雪一千3 小时前
Python如何使用XPath定位没有特征的元素?无id、无class通用定位技巧
开发语言·python
艾莉丝努力练剑3 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
流浪0013 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·python
光影少年4 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
SomeB1oody4 小时前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
言乐67 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame