剑指 Offer 03. 数组中重复的数字
排序
通过对数组排序,相同的数字必定相邻,扫描一下就行,但是时间复杂度为O(nlogn)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-1;i++)
{
if(nums[i]==nums[i+1])
{
return nums[i];
}
}
return 0;
}
};
哈希表
时间复杂度为O(n),空间复杂度为O(n)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int, bool> tmp;
for(int i=0; i<nums.size(); i++)
{
if(tmp.count(nums[i]))
{
return nums[i];
}
tmp[nums[i]]=true;
}
return 0;
}
};
遍历
这个遍历的方法比较取巧,因为n个数字对应0到n-1,那么只要在遍历的时候,把相应的值放在对应的位置,那么等下次再有值要放在对应位置的时候,就找到了重复数字。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i=0; i<nums.size(); i++)
{
while(nums[i] != i)
{
if(nums[i] == nums[nums[i]])
{
return nums[i];
}
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return 0;
}
};