剑指Offer——数组中重复的数字
数组中重复的数字
https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&&tqId=11203&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
看到题目第一反应是:哈希
或者:排序,再依次遍历找到重复数字
或者:排序,如果第i个位置的数字不是i,一定存在重复
方法一:哈希
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,int> hashmap;
for(int i:nums)
{
hashmap[i]++;
if(hashmap[i]>1)
{
return i;
break;
}
}
return -1;
}
};方法二:排序,遍历
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];
break;
}
}
return -1;
}
};方法三
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
while(i!=nums[i])
{
if(nums[i]==nums[nums[i]])
{
return nums[i];
break;
}
swap(nums[i],nums[nums[i]]);
}
}
return -1;
}
};第三个方法自己没有改出来,照着书上思路重新敲的,自己的代码没有考虑如果数组中的数字是{1,2,3,3},即没有0的情况。
书中代码完美避开这个问题。
最后时间最少的是方法三。
越努力,越幸运!
查看9道真题和解析
