首页 > 编程语言 >「代码随想录算法训练营」第五天 | 哈希表 part1

「代码随想录算法训练营」第五天 | 哈希表 part1

时间:2024-07-08 16:09:58浏览次数:11  
标签:map set num int 随想录 part1 vector 哈希 unordered

242. 有效的字母异位词

题目链接:https://leetcode.cn/problems/valid-anagram/
题目难度:简单
文章讲解:https://programmercarl.com/0242.有效的字母异位词.html
视频讲解: https://www.bilibili.com/video/BV1YG411p7BA
题目状态:一次过,哈哈哈

个人思路:

之前在《剑指offer》中做过这个题目,思路就是直接创建两个26位的数组,分别存放两个字符串中出现的小写字母的个数,若最后这两个数组相等,则表示这两个字符串互为字母异位词。

实现代码:

class Solution {
public:
    bool isAnagram(string s, string t) {
        int sLen = s.size();
        int tLen = t.size();
        if(sLen != tLen) return false;

        vector<int> sCount(26);
        vector<int> tCount(26);
        for(int i = 0; i < sLen; ++i) {
            sCount[s[i] - 'a']++;
        }
        for(int i = 0; i < tLen; ++i) {
            tCount[t[i] - 'a']++;
        }
        if(sCount != tCount) return false;
        return true;
    }
};

349. 两个数组的交集

题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/
题目难度:简单
文章讲解:https://programmercarl.com/0349.两个数组的交集.html
视频讲解: https://www.bilibili.com/video/BV1ba411S7wu
题目状态:纠错后通过

个人思路:

  1. 创建两个unordered_map<int, int>类型的表分别存放两个数组中出现的数字和个数;
  2. 创建一个vector<int>类型的数组res用来存放交集;
  3. 遍历第一个map,若在第二个map中找到其键等于第一个map中的键,将其添加到res中;
  4. 遍历完成后返回res

实现代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        unordered_map<int, int> One;
        unordered_map<int, int> Two;
        for(auto &num : nums1) {
            One[num]++;
        }
        for(auto &num : nums2) {
            Two[num]++;
        }
        for(auto &num: One) {
            if(Two.find(num.first) != Two.end()) {
                res.push_back(num.first);
            }
        }
        return res;
    }
};

看了代码随想录中的思路,可以用unordered_set来实现,思路大致类似,但是写的比我好多了,突然发现我代码中的map用的比较多余,而且不需要将两个数组都存入map中,代码如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

202. 快乐数

题目链接:https://leetcode.cn/problems/happy-number/
题目难度:简单
文章讲解:https://programmercarl.com/0202.快乐数.html
题目状态:没有思路

标签:map,set,num,int,随想录,part1,vector,哈希,unordered
From: https://www.cnblogs.com/frontpen/p/18290097

相关文章

  • 代码随想录算法训练营第25天 | 491.递增子序列
    491.递增子序列给定一个整型数组,你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入:[4,6,7,7]输出:[[4,6],[4,7],[4,6,7],[4,6,7,7],[6,7],[6,7,7],[7,7],[4,7,7]]说明:给定数组的长度不会超过15。数组中的整数范围是[-10......
  • [Redis]一致性哈希
    一致性哈希算法(ConsistentHashing)最早在论文《ConsistentHashingandRandomTrees:DistributedCachingProtocolsforRelievingHotSpotsontheWorldWideWeb》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-......
  • 代码随想录算法训练营第56天 | 42. 接雨水 、84.柱状图中最大的矩形
    图论理论基础大家可以在看图论理论基础的时候,很多内容看不懂,例如也不知道看完之后还是不知道邻接矩阵,邻接表怎么用,别着急。理论基础大家先对各个概念有个印象就好,后面在刷题的过程中,每个知识点都会得到巩固。https://www.programmercarl.com/kamacoder/图论理论基础.html......
  • 代码随想录算法训练营第55天 | 42. 接雨水 、84.柱状图中最大的矩形
    接雨水接雨水这道题目是面试中特别高频的一道题,也是单调栈应用的题目,大家好好做做。建议是掌握双指针和单调栈,因为在面试中写出单调栈可能有点难度,但双指针思路更直接一些。在时间紧张的情况有,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何优化。https://p......
  • Leetcode刷题记录1 哈希+双指针+滑动窗口
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言hot1001.哈希#1.两数之和#49.字母异位词分组#128.最长连续序列2.双指针#283.移动零#11.盛最多水的容器#15.三数之和#42.接雨水3.滑动窗口#3.无重复字符的最长子串#438.找到字符串中所有......
  • Python——习题练习 part1
     本人于下学期该学习python,在听黑马程序员网课后,在此总结记录我的在课程学习后的习题练习。没有详细的解题过程,仅有代码和注释,如有错误希望大家多多指出。目录一,字符串格式化 二,条件判断01if语句 02ifelse语句 03ifelif组合 04判断语句综合案例 三,循环01......
  • 「代码随想录算法训练营」第一天(补) | 数组 part1
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/题目难度:简单文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715题目状态:通过个人思路:就是简单的二分查找思路,判断数组中间的值是否等于目......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个
    24.两两交换链表中的节点 题目:.-力扣(LeetCode)思路:这题关键是要每次进行两个结点的操作,并且每次都要保存其前结点,做题思路比较清晰,但是总是处理不好边界问题,总是越界。代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*List......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 、 707.设计链表 、206.反转链表
    203.移除链表元素题目:.-力扣(LeetCode)思路:主要是通过运用虚拟头节点来统一移除元素的写法。代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode......
  • 代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题
    24.两两交换链表中的节点迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。递归的版本:这道题用递归做简直不要太简单,首先明白递归结束......