题目描述:
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number 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, O(1) extra space.
- Your runtime complexity should be less than
O(n2)
. - There is only one duplicate number in the array, but it could be repeated more than once.
给定n+1个数,取值范围为[1,n],其中一个数出现两次,其他所有数都只出现一次,求这个数。
由于数组取值范围都特殊性,可以令元素都取值为下一个元素的指针,即元素的值为下一个元素的下标,例如nums=[2,4,5,3,5,1],那么可看作链表2->5->1->4->5,可见重复的数为链表的环的起点,所以可以采用求链表的环的起点的方法。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow=0;
int fast=0;
while(true)
{
slow=nums[slow];
fast=nums[nums[fast]];
if(nums[slow]==nums[fast]) break;
}
int temp=0;
while(nums[temp]!=nums[slow])
{
slow=nums[slow];
temp=nums[temp];
}
return nums[slow];
}
};