287. Find the Duplicate Number
Medium
3145369FavoriteShare
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.
Example 1:
Input: [1,3,4,2,2] Output: 2
Example 2:
Input: [3,1,3,4,2] Output: 3
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.
- 与442题类似,但注意本题该重复数字只有一个,可以重复不止一次。
- A.相反数
- Runtime: 12 ms, faster than 74.01% of C++ online submissions for Find the Duplicate Number.
- Memory Usage: 10 MB, less than 67.50% of C++ online submissions for Find the Duplicate Number.
- B.交换到该数字应该在的地方,数组最后一个数字就是发生重复的数字:
- Runtime: 12 ms, faster than 74.01% of C++ online submissions for Find the Duplicate Number.
- Memory Usage: 9.8 MB, less than 100.00% of C++ online submissions for Find the Duplicate Number.
- C.加n
- Runtime: 8 ms, faster than 97.65% of C++ online submissions for Find the Duplicate Number.
- Memory Usage: 10 MB, less than 62.50% of C++ online submissions for Find the Duplicate Number.
- Next challenges:
- First Missing Positive
- Linked List Cycle II
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
if(nums[abs(nums[i])-1]<0) return abs(nums[i]);
else nums[abs(nums[i])-1]*=-1;
}
return nums[n-1];
}
};
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
if(nums[i]!=nums[nums[i]-1]){
swap(nums[i],nums[nums[i]-1]);
i--;
}
}
return nums[n-1];
}
};
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
nums[nums[i]%n-1]+=n;
}
for(int i=0;i<n;i++){
if(nums[i]>2*n) return i+1;
}
return 0;
}
};