给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
题目言简意赅,但是这道题被划分为双指针
模块,想想可能没那么容易。
试了意向解法都可以通过:
- 先排序,一遍 for 循环
- 使用 map 做一下缓存
- 测试两层 for 循环也可以通过
- 快慢指针!
既然要使用快慢指针,那必须得构造出一个链表,并且慢指针是指向下个节点,快指针是指向下下个节点,而这题恰巧是,n + 1 个整数都小于 n,那么数组的索引和值可以在里面循环使用,此次的值可以作为下一次的索引。并且有个烧脑的事情是,在快慢指针第一次相遇的时候并不一定是重复的整数
,而环的入口点则恰好是重复的整数
,labuladong 的算法上提到一个环入口的计算方法,终于也排上了用场。
func findDuplicate(nums []int) int {
fast, slow := 0, 0 // 索引
slow = nums[slow] // 指向下一个
fast = nums[nums[fast]] // 指向下下个
for slow != fast { // 一直到相遇
slow = nums[slow] // 指向下一个
fast = nums[nums[fast]] // 指向下下个
}
fast = 0
for slow != fast { // 继续前进 直到相遇就是环的入口点
slow = nums[slow]
fast = nums[fast]
}
return slow
}