除了暴力解法外,
对于搜索重复数字的题目,肯定要先想到哈希表快速搜索,本题需要注意的是不需要再对应成太多数值,只需要把是否重复对应成true,false就可以了
方法1:哈希表 时间O(n),空间O(n)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,bool> map;
for(int num:nums){
if(map[num]==true) // 如果哈希表中已经有相同值,那么直接返回重复值
return num;
else
map[num]=true; // 如果不是true,说明不是重复值,加入哈希表中,进行下一个值判断
}
return -1;
}
};
方法二:原地调换(鸽巢原理) 时间O(n),空间O(1)
由于是在长度为n的数组中,数字范围为0 ~ n-1 ,那么只需要把对应的数放到相应的下标处,判断当前该下标处是否等于,如果相等则说明重复,不相等则进行调换。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i=0; //i作为计算排序好的个数
while(i<nums.size()){
if(nums[i]==i){
i++;
continue;
}
if(nums[nums[i]]==nums[i])
return nums[i];
swap(nums[i],nums[nums[i]]);
}
return -1;
}
};
方法三:排序然后比较相邻元素,相等就返回,可以用二分排序,时间O(n log n),空间O(1)