代码随想录|day 6

Day5 hash table

做了一些改进的尝试,嘻嘻。说明:此篇为阅读学习刷题notes,参考内容均标注链接。

用法速览:

 unordered_setnums_set(nums1.begin(),nums2.end());

2.Set.find()的使用_c++ set find-CSDN博客

一、理论学习

以下为notes,阅读:代码随想录 (programmercarl.com)

关于STL(Standard Template Library) :C++ STL详解超全总结(快速入门STL)-CSDN博客

代码随想录|day 6_第1张图片

​ 说来惭愧,哈希表贯穿学习始终,除了大一课设用了之后一直搁置,幸运的是现在还是决定重新学习。当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。

  • 数组

  • set (集合)

  • map(映射)

    代码随想录|day 6_第2张图片

二、刷题部分

242. 有效的字母异位词

我觉得掌握了 代码如下:

  • 时间复杂度: O(n)
  • 空间复杂度: O(1)
class Solution {
public:
    bool isAnagram(string s, string t) {
       int s_hash[26]={0};
       for(int i=0;i

解题思路(这个思路概括的很好很简洁,其实我之前已经这样操作很多次了,没意识到是hash罢了)
标签:哈希映射
首先判断两个字符串长度是否相等,不相等则直接返回 false
若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
s 负责在对应位置增加,t 负责在对应位置减少
如果哈希表的值都为 0,则二者是字母异位词

作者:画手大鹏
链接:https://leetcode.cn/problems/valid-anagram/solutions/6690/hua-jie-suan-fa-242-you-xiao-de-zi-mu-yi-wei-ci-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[349. 两个数组的交集

解题思路(这个图特别清晰):

代码随想录|day 6_第3张图片

看代码有一个问题搞不清楚:Set.find()的使用_c++ set find-CSDN博客

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        //set or array
        //讲解用的set set我也不会 就用set吧
        //哈希表善于解决什么样的问题:给你一个元素判断在这个集合里是否出现过
        //set用法好陌生 呜呜
        unordered_setresult;
        unordered_setnums_set(nums1.begin(),nums1.end());
        for(int num:nums2){
            if(nums_set.find(num)!=nums_set.end()){
                result.insert(num);
            }
        }
        return vector(result.begin(),result.end());
    }
};

[202. 快乐数 - 力扣(LeetCode)

代码:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

class Solution {
public:
    //给一个数,得到他的各位的平方和
    int getsum(int n){
        int sum=0;
        while(n){
            sum+=(n%10)*(n%10);
            n=n/10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_setset;
        while(1){
            int sum=getsum(n);
            if(sum==1){
                return true;
            }
            if(set.find(sum)!=set.end()){
                return false;
            }
            else{
                set.insert(sum);
            }
            n=sum;
        }   
        

    }
};

1. 两数之和

很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。2021年做过这道

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

而今迈步从头越 到map了耶 :map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        std::unordered_mapmap;
        for(int i=0;isecond,i};
            }
             map.insert(pair(nums[i], i)); 
        }
        return {};
        
    }
};

三、chat

今天效率特别高,可能是因为心情特别不好【奇奇怪怪】。不知道到底能不能考上,不知道努力付出如果没有回报对之后的意义,那段时光的意义,其实注定是失败的,还是不甘心的在这里搏一搏。今天真棒,下午就完成了全部题目。

一切都因为,历史的接力棒已经在我们手中。**我们是社会的中坚,不是因为我们身在高位,不是因为我们资金丰足,不是因为我们聪明绝顶,不,我们甚至并不比任何一代中国人优秀,只是我们有此机会。我们有一个机会把中国变得更好,我们有一个责任把中国变得更好。我们不能彼此耳语,而要朗声合唱,**这歌声要求着国家与人的共同幸福,从一百多年前而来,回荡今时今日。

这就是为什么我们要相信自己的使命,让无力者有力,让悲观者前行。这就是为什么我们必须了解真相,不能坠入一个失真的世界。这就是为什么当我们讲述自己对国家的爱时,可以平静、深邃和坚定。

这就是为什么我们既不随波逐流,也不凌空虚蹈;这就是为什么我们要做现实主义者,求应然之事。【南方周末2009新年献词】

你可能感兴趣的:(哈希算法,算法,c++)