代码随想录|day 6

本文介绍了C++中的哈希表和STL在解决LeetCode问题中的应用,包括哈希映射、字母异位词检测、数组交集、两数之和等算法,并结合实际例子展示了如何提高代码效率。
摘要由CSDN通过智能技术生成

Day5 hash table

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

用法速览:

 unordered_set<int>nums_set(nums1.begin(),nums2.end());

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

一、理论学习

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

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

img

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

  • 数组

  • set (集合)

  • map(映射)

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、刷题部分

242. 有效的字母异位词

我觉得掌握了 代码如下:

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

       }
       for(int j=0;j<t.size();++j){
           s_hash[t[j]-'a']--;
       }
       for(int i=0;i<26;++i){
           if(s_hash[i]!=0){
               return false;
           }
       }
       return true;
    }
};

解题思路(这个思路概括的很好很简洁,其实我之前已经这样操作很多次了,没意识到是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. 两个数组的交集

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

img

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

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //set or array
        //讲解用的set set我也不会 就用set吧
        //哈希表善于解决什么样的问题:给你一个元素判断在这个集合里是否出现过
        //set用法好陌生 呜呜
        unordered_set<int>result;
        unordered_set<int>nums_set(nums1.begin(),nums1.end());
        for(int num:nums2){
            if(nums_set.find(num)!=nums_set.end()){
                result.insert(num);
            }
        }
        return vector<int>(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_set<int>set;
        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<int> twoSum(vector<int>& 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<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int>map;
        for(int i=0;i<nums.size();++i){
            auto iter = map.find(target - nums[i]); 
            if(iter!=map.end()){
                return {iter->second,i};
            }
             map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
        
    }
};

三、chat

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值