题目链接: https://leetcode-cn.com/problems/find-the-duplicate-number/
这题不会写,看了题解有三种思路,这里介绍两种。
二分
对结果进行二分查找,对于 mid,遍历数组统计有多少个元素小于等于 mid,如果元素数量大于 mid,说明在 [L, mid] 部分有重复数字;否则在 [mid+1, R] 部分有重复数字。
floyd 判圈
对于数组每个元素,从 index 向 nums[index] 建立一条有向边,由于存在元素重复,肯定至少存在一个元素被指向两次。
主要注意的是,元素的范围是 [1, n],也就是可能会访问除了 index=0 的所有其他 index,我们从 0 开始沿着有向边走,一定会存在环。
问题就转变成了球该环的入口节点。
可以先用floyd 龟兔赛跑找到一个相遇点,然后从起点和相遇点分别开始前进,第一次相遇时的点就是环的入口节点。
证明: