解法一:简单遍历
使用哈希集合标记。
时间复杂度 O(n),空间复杂度 O(n)。
int findRepeatNumber(vector<int>& nums) {
int len = nums.size();
unordered_map<int,int> hash;
for(int i=0;i<len;i++){
if(hash[nums[i]]==0) hash[nums[i]]++;
else return nums[i];
}
return 0;
}
解法二:简单遍历优化 (原地算法)
因为所有数字都在 0~n-1 的范围内,所以考虑原地算法,一个萝卜一个坑,直到位置重复。遍历中,第一次遇到数字 x 时,将其交换至索引 x 处;而当第二次遇到数字 x 时,一定有nums[x]==x ,此时即可得到一组重复数字。
时间复杂度 O(n),空间复杂度 O(1)。
int findRepeatNumber(vector<int>& nums) {
int len = nums.size();
int i=0;
while(i<len){
if(nums[i]==i){ //位置匹配
i++; //只有位置匹配时才处理下一位
continue;
}else if(nums[i] == nums[nums[i]]) //位置重复
return nums[i];
else swap(nums[i],nums[nums[i]]);
}
return -1;
}