Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate element must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant extra space.
- Your runtime complexity should be less than
O(n2)
.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
给定一个数组,包含n+1个数字,数字的范围为[1,n],数组中仅有一个数字出现多次,找出这个数字。
注意:在[1,n]中可能有数字不会出现
循环检测,因为有数字可能出现多次,如果所以有i!=j,nums[i]==nums[j]。所以在递推的过程中
x=nums[i]->i=x->x=nums[i]->i=x->x=nums[i]会出现环
转换一下,接下来要做的就是一步两步,是爪牙,是魔鬼的步伐,魔鬼的步伐
AC代码:
class Solution
{
public:
int findDuplicate(vector<int>& nums)
{
int slow =0;
int fast =0;
while(1)
{
slow=nums[slow];
fast=nums[nums[fast]];
if(slow == fast)
break;
}
fast = 0;
while(1)
{
slow=nums[slow];
fast=nums[fast];
if(slow==fast)return slow;
}
}
};
其他leetcode题目AC代码: https://github.com/PoughER