剑指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的循环条件和最后返回值的选择
posted @ 2022-11-15 15:26  神鹏佐佑  阅读(20)  评论(0)    收藏  举报