剑指offer——Day04查找算法(简单)
Day4 2022.11.10 字符串(简单)
自己实现
创建一个set,遍历整个数组,先判断set里有没有这个元素,若无,则加入到set中;若有,则直接return这个元素作为答案即可
代码如下:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
set<int> s;
for(int i=0;i<nums.size();i++)
{
if(s.find(nums[i])!=s.end())
{
return nums[i];
}
s.insert(nums[i]);
}
return 0;
}
};
代码表现:

题解
用哈希表unorderde_map<>
代码如下:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int, bool> set;
for(auto val:nums)
{
if(set[val])return val;
set[val]=true;
}
return 0;
}
};
代码表现
这个时间不稳定的,应该是和哈希表的哈希函数有关

hint:
- 哈希表在c++里面是unorderde_map<>!!!
53.Ⅰ.在排序数组中查找数字
自己实现
直接调用count()函数
class Solution {
public:
int search(vector<int>& nums, int target) {
return count(nums.begin(),nums.end(),target);
}
};
代码实现

hint:
- vector要用count的话,直接调用
count(),但count()不是vector的内置函数,需要使用cnt=count(vec.begin(),vec.end(),target);
53.Ⅱ.0~n-1中缺失的数字
自己实现
就判断每个位置的元素是否和下标相等即可。要注意如果给了一个正常的数组如[0],说明缺失的是1
代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i;
for(i=0;i<nums.size();i++)
{
if(nums[i]!=i)return i;
}
return i;
}
};
代码表现

题解
用二分查找。代码中为啥要一直while直到left<=right,是因为要保证最后的位置是最开始出现遗漏错误的位置。而最后返回left的理由是while中if(nums[m]==m)所以最后一次while得到的m是最后一个正确的位置。而left=m+1,所以最后应该返回left
代码如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int left=0,right=nums.size()-1;
while(left<=right) //while条件值得注意
{
int m=(left+right)/2;
if(nums[m]==m)left=m+1;
else right=m-1;
}
return left;
}
};
代码表现

hint:
- 二分查找要注意while的循环条件和最后返回值的选择
浙公网安备 33010602011771号