leetcode刷题(第六天) 哈希表理论基础 ;242.有效的字母异位词 ; 349. 两个数组的交集 ; 202. 快乐数; 1. 两数之和

今日任务 哈希表理论基础 242.有效的字母异位词  349. 两个数组的交集  202. 快乐数 1. 两数之和   

卡哥建议:什么时候想到用哈希法当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法  

重点:要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法

参考链接:代码随想录:代码随想录 (programmercarl.com)

补充:35搜索插入位置;34在排序数组中查找元素的第一个和最后一个位置;69.X的平方根;367.有效的完全平方数

 哈希表理论基础

题目讲解(全):代码随想录

题目建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。 什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。

看完代码随想录之后的想法:

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

每日精华:

242.有效的字母异位词

题目讲解(全):代码随想录

题目建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 

刷题链接:力扣题目链接

视频讲解:《代码随想录》算法视频公开课 (opens new window)学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词

看完代码随想录之后的想法:

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            // 不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

自己实现过程中遇到哪些困难:最后记得时for循环进行遍历record数组判断是否为0;

每日精华:

类似题目:383.赎金信

49.字母异位词分组

438.找到字符串中所有字母异位词

 349. 两个数组的交集 

题目讲解(全):代码随想录

题目建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 

刷题链接:力扣题目链接

看完代码随想录之后的想法:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //存放结果的数组
        unordered_set<int> result_set;
        //重置nums1数组-不重复-乱序
        unordered_set<int> nums1_set(nums1.begin(),nums1.end());
        //在num2中找重复的
        //for each用法:num--遍历nums2
        for(int num:nums2)
        {
            if(nums1_set.find(num) !=nums1_set.end()){
                result_set.insert(num);
            }
        }
        return vector<int> (result_set.begin(),result_set.end());
    }
};

数组写法

lass Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //存放数组
        unordered_set<int> result_set;
        //设置超过1000的数组
        int hash[1008]={0};
        for(int num:nums1)
        {
            hash[num]=1;
        }
        for(int num:nums2)
        {
            if(hash[num]==1)
            {
                result_set.insert(num);
            }
        }
        return vector<int> (result_set.begin(),result_set.end());
    }
};

 

自己实现过程中遇到哪些困难:int num: nums2(遍历)·        

find():查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器

end():返回指向容器中最后一个元素之后位置的正向迭代器

hash[num]=1;//nums1中出现的数字在数组中做记录

每日精华:

类似题目:242. 有效的字母异位词

350.两个数组的交集 II

202. 快乐数

题目讲解(全):代码随想录

题目建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子 

刷题链接:力扣题目链接

class Solution {
public:
    //设置一个计算各个位置和的元素
    int getsum(int n){
        //计算各个位置数之和
        int sum=0;
        while(n)
        {
            sum+=(n %10)*(n %10);
            n/=10;
        }
        return sum;
    }
    //判断是否是快乐数
    bool isHappy(int n) {
        //创建一个寻找的hash表---方便遍历--unordered_set
        unordered_set<int> get_Sum;
        //判断n
        while(1){
            int sum=getsum(n);
            if(sum==1){
            return true;
            }
            //不等于相当于有重复的--即开始循环了;
            if(get_Sum.find(sum)!=get_Sum.end()){
                return false;
            }
            else{
                get_Sum.insert(sum);  
            }
        n=sum; 
        }
    }
};

视频讲解:

自己实现过程中遇到哪些困难:计算各个位置数之和时,的while循环;

每日精华:

 1. 两数之和

题目讲解(全):代码随想录

题目建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。 

       当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

刷题链接:力扣题目链接

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        //数组中同一个元素在答案里不能重复出现--可使用map;
        std::unordered_map<int,int> map;
        //遍历数组-和map有什么关系呢;target-nums[i]==找他,
        for(int i=0;i<nums.size();i++)
        {
            //找值
            auto iter = map.find(target-nums[i]);
            if(iter!= map.end()){
                //证明map里有此值
                return {iter->second,i};
            }
            //else{
                //没有
                map.insert(pair<int,int> (nums[i],i));
            //}
        }
        return {};
    }
};

视频讲解:梦开始的地方,Leetcode:1.两数之和 (opens new window),

看完代码随想录之后的想法:

自己实现过程中遇到哪些困难

每日精华:

类似题目:

今日收获,记录一下自己的学习时长:

优质文章:学习参考:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值