题目描述
解法一:弗洛伊德的龟和兔子(C++)
通过下面的演示过程知道这是一道有环链表的问题,而要求找到的重复数字其实就是环的入口
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int tortoise = nums[0];
int hare = nums[0];
while(1)
{
tortoise = nums[tortoise];
hare = nums[nums[hare]];
if(tortoise==hare) break;
}
int ptr1 = nums[0];
int ptr2 = tortoise;
while(ptr1 != ptr2)
{
ptr1 = nums[ptr1];
ptr2 = nums[ptr2];
}
return ptr1;
}
};
解法二:二分法(Python)
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
left = 1
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
cnt = 0
for num in nums:
if num <= mid:
cnt += 1
if cnt <= mid:
left = mid + 1
else:
right = mid
return left