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.
这题也算是,比较经典了吧?找到一个数组中唯一重复的那个数。本来想用异或做,然后发现自己可能是短路了,1^2^3=0的,怕不是失了智吧23333
这题跟循环链表2(LeetCode142求一个链表环的起始结点)解法上有共通之处。可以这样想,每一个位置i的数通向nums[i],那么就会有多条链指向同一个结点,而只存在一个环。那么从任何一个非环上结点出发,就相当于找到环的起始结点。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow = nums[nums.size()-1];
int fast = nums[nums[nums.size()-1]-1];
while (slow != fast) {
slow = nums[slow-1];
fast = nums[nums[fast-1]-1];
}
int ans = nums.size();
while (ans != slow) {
ans = nums[ans-1];
slow = nums[slow-1];
}
return ans;
}
};