leetcode-287. 寻找重复数-数组构成的链表

287. 寻找重复数

  • 由题中数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

  • 维护一个映射关系f(n)= index -> num,其中数组的下标index,数字为num

当一个数组里有环的时候,例如

[1,3,4,2,2]  [3,1,3,4,2]

映射为:

0 -> 1   0 -> 3

1 -> 3   1 -> 1

2 -> 4   2 -> 3

3 -> 2   3 -> 4

4 -> 2   4 -> 2

得链表:

我们得到入环点的数 = 重复的数

这道题就变成了快慢指针找入环点的题,只是快慢指针表示不同

public int findDuplicate(int[] nums) {
int slow = 0;//slow指针从0开始
int fast = 0;//fast指针从0开始
slow = nums[slow]; //慢指针一次走一步
fast = nums[nums[fast]]; //快指针一次走两步
while(slow != fast){ //当快慢指针相遇的时候得到结果,如果没相遇则一直循环
//有题目可知这个数组里绝对有一个重复的,所以必定成环
slow = nums[slow]; //慢指针一次走一步
fast = nums[nums[fast]]; //快指针一次走两步
}
fast = 0; //让快指针回到开头
while(slow != fast){ //当快慢指针相遇的时候得到结果,没相遇则一直循环
slow = nums[slow]; //慢指针一次走一步
fast = nums[fast]; //快指针一次走两步
}
return slow; //最终相遇返回slow就是成环的点
}

 

posted on   老菜农  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

统计信息

点击右上角即可分享
微信分享提示