
心路历程:
这道题对于时间复杂度没有要求但是对空间复杂度有要求,因此需要双指针。
这道题本质是一个环形链表II的题,且环一定在以0为起点的指针那里:

注意的点:
1、注意要让指针进入循环,使用do while结构
2、注意返回f或者s而不是nums[f]和nums[s]
解法一:快慢指针
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
# # 环型链表II
f, s = 0, 0
while True:
s = nums[s]
f = nums[nums[f]]
if s == f: break # 注意先进入循环
s = 0
while f != s:
s = nums[s]
f = nums[f]
return f # 返回的是f不是nums[f]
解法二:集合(不满足空间要求)但是能通过
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
s = set(nums)
return (sum(nums) - sum(s)) // (len(nums) - len(s))

本文介绍了如何用双指针技巧解决环形链表II问题,强调了在进入循环和返回值方面的注意事项。同时,文中提到了另一种使用集合的方法,尽管空间复杂度不满足要求,但展示了不同的解决方案思路。
823

被折叠的 条评论
为什么被折叠?



