Description
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.
Solution
discussion 里还有用 floyd circle algorithm的,没看懂。。。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int len = nums.size();
vector<bool> record(len-1,false);
for (int i = 0; i < len; ++i) {
if (!record[nums[i]-1]) record[nums[i]-1] = true;
else return nums[i];
}
return -1;
}
};
result:
Runtime: 4 ms, faster than 99.06% of C++ online submissions
Memory Usage: 8.3 MB, less than 37.72% of C++ online submissions