代码随想录算法训练营第六天| 242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数,1. 两数之和

在这里插入图片描述
对于这类型需要记录下已经遍历过的元素,并且在后续快速查找使用的情景(快速判断一个元素是否出现集合里的时候)就是使用哈希表方法的时机。相关的容器和数据结构包括set,map和数组

class Solution {
public:
    bool isAnagram(string s, string t) {
         if(s.empty() || t.empty() || s.size() != t.size()){
            return false;
         }
         unordered_map<char,int> sDataMap;
         unordered_map<char,int> tDataMap;
         for(char i : s){
            if(sDataMap.count(i) == 0){
                sDataMap.insert(pair<char,int>(i,1));
            }else{
                unordered_map<char,int>::iterator it = sDataMap.find(i);
                (it->second)++;
            }
         }
         for(char i : t){
            if(tDataMap.count(i) == 0){
                tDataMap.insert(pair<char,int>(i,1));
            }else{
                unordered_map<char,int>::iterator it = tDataMap.find(i);
                (it->second)++;
            }
         }
         for(auto it : sDataMap){
            if(tDataMap.count(it.first) <= 0){
                return false;
            }
            if(tDataMap.find(it.first)->second != it.second){
              return false;
            }
         }
         return true;
    }
};

上述代码其实就是把两个字符串从头到尾遍历一遍,所有字符和出现次数组成键值对塞入两个字符串各自对应的unordered_map里,然后比较两个unordered_map是否有未出现的键值或是出现次数对不上的数值。需要注意的是一些边界情况,例如初始字符串为空和字符串间长度不一的情况,直接处理。

在这里插入图片描述
找交集,是不是也是一个需要快速判断某个元素是否已出现的情景,那就也是哈希表的思路,同时,输出结果元素的出现是唯一的,考虑使用set容器

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
         unordered_set<int> nums1Set;
         unordered_set<int> nums2Set;
         vector<int> res;
         for(auto i : nums1){
           nums1Set.insert(i);
         }

         for(auto i : nums2){
           nums2Set.insert(i);
         }

         for(auto i : nums1Set){
            if(nums2Set.count(i) > 0){
                res.push_back(i);
            } 
         }
         return res;
    }
};

其实就是把两个数组的值各自放进set,然后比较set之间是否有刚好对上的元素,就是交集了

在这里插入图片描述
在这里插入图片描述
注意看示例,判断不是快乐数时候
n = 2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4 (循环了!!!)
也就是说,如果某个时刻各个位的平方和结果已出现,即可判断非快乐数,拿下!

class Solution {
public:
    bool isHappy(int n) {
      unordered_set<int> sumSet;
      int res = n;
      while(1){
          if(sumSet.count(res) > 0){
              return false;
          }
         sumSet.insert(res);
         string nString = to_string(res);
         int sum = 0;
         for(int i = 0;i < nString.size();i++){
            sum += pow((int)(nString[i] - '0'),2);
         }

         if(sum == 1){
            return true;
         }
         res = sum;
      }
    }
};

选取未知大小的数的各个位的值这里,我用的把整数与string互转,直接操作char的ASCII的办法,主打一个好写

在这里插入图片描述
这道题如果不是整数数组和target可能取负数,用一个大数组来充当哈希表也可行,这里用的map

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       unordered_map<int,int> nums_map;
       vector<int> res;
       for(int i = 0;i< nums.size();i++){
          nums_map.insert(pair<int,int>(nums[i],i));
       }
       for(int i = 0;i < nums.size();i++){
          if(nums_map.count(target-nums[i]) > 0){
            if(i == nums_map.find(target-nums[i])->second){
                continue;
            }
             res.push_back(i);
             res.push_back(nums_map.find(target-nums[i])->second);
             break;
          }
       }
       return res;
    }
};

哈希表的解法主要是用来处理需要检查某个元素是否已经出现在集合中的场景,备选的结构包括set,map和数组,像是找交集,找交点,比较异同这种题目来说是一个很好的思考角度。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值