首页 > 其他分享 >代码随想录第6天 | ●哈希表理论基础●242.有效的字母异位词●349. 两个数组的交集●202. 快乐数●1. 两数之和

代码随想录第6天 | ●哈希表理论基础●242.有效的字母异位词●349. 两个数组的交集●202. 快乐数●1. 两数之和

时间:2024-06-12 20:32:40浏览次数:8  
标签:set key sum 随想录 数组 202 哈希 unordered 两数

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

思路:

1.ASCII和哈希函数,存入数组,比较数组相等否
2.首先选择数据结构,题目只有小写字母,ASCII连续,选用数组,一个字符串遍历,在哈希数组中存入字母出现频率,第二个字符串遍历,做减法。(不需要记ASCII,直接减字母,编译器自己算)
时间复杂度: O(n)
空间复杂度: O(1)

坑:

补充:

哈希表理论基础

  1. 哈希表是hash table 又叫散列表, 多用于快速判断某意思元素是否在集合里。(数组是一个哈希表。)
  2. 哈希函数hash function把 实际的目标 映射到 哈希表上。
  3. 哈希碰撞(冲突) 实际目标映射到了相同索引下标的位置。解决方法:
    ①拉链法:冲突的元素 存储在链表中
    ②线性探测法:要保证tableSize 大于dataSize,冲突的元素 存储在冲突位置往后的空位上。
    常见的哈希结构
  4. 数组
  5. set(集合)
  6. map(映射)
    set和map的底层实现及优劣表
集合set 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::set 红黑树 有序 O(log n) O(log n)
std::multiset 红黑树 有序 O(logn) O(logn)
std::unordered_set 哈希表 无序 O(1) O(1)

使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,
如果需要集合是有序的,那么就用set,
如果要求不仅有序还要有重复数据的话,那么就用multiset。

映射map 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率
std::map 红黑树 key有序 key不可重复 key不可修改 O(logn) O(logn)
std::multimap 红黑树 key有序 key可重复 key不可修改 O(log n) O(log n)
std::unordered_map 哈希表 key无序 key不可重复 key不可修改 O(1) O(1)

红黑树
红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

题目:349.两个数组的交集

思路:

  1. 类似上题,使用数组,根据元素的数值,存入数组对应下标中 但如果数值很大,映射到数组下标就不合适。
  2. 该题去重,则选择unordered_set
    时间复杂度: O(n + m) m 是最后要把 set转成vector
    空间复杂度: O(n)

坑:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size()<nums2.size()){
            nums1.swap(nums2);
        }
        unordered_set<int> hash_set(nums1.begin(),nums1.end());
        unordered_set<int> result_set;
       for(int num: nums2){
            if(hash_set.find(num)!=hash_set.end()){
                result_set.insert(num);
                 //在集合hash_set中使用find函数查找num,找到返回一个指向该元素的正向迭代器,反之,返回一个类似end()的迭代器
                 //找到则将该元素存入结果集合result_set中
            }
       }
        return vector<int>(result_set.begin(),result_set.end());
        //因为函数返回类型是vector 所以转换一下类型
    }
};

补充:

set集合
C++ STL unordered_set容器

成员方法 功能
find(key) 查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(一个与end() 方法相同的迭代器)。
count(key) 在容器中查找值为 key 的元素的个数。
empty() 若容器为空,则返回 true;否则 false。
size() 返回当前容器中存有元素的个数。

范围for循环

范围循环:
for (类型 element : myVector) {
    std::cout << element << " ";
}

题目:202.快乐数

思路:

对n取余存入unordered_set 然后判断和是否为1,题目说可能无限循环,不知怎么判断

  1. 无限循环是sum会重复出现 ,所以将每次循环的sum存入sums_set, 查找是否存在。
    2.看leetcode题解:双指针

坑:

1.数位分离,求平方和,可以简单的while和sum,不用多一步将个个数位上的值存入nums_set
2. % 是整数取余,/ 是除号

class Solution {
public:
    bool isHappy(int n) {
        unordered_set<int> sums_set;
        int sum = 0;
        while (sum != 1) {
            sum=0;  //错误,sum 没有更新为0;
            while (n ) {// 错误 while的循环判断条件 不是n/10,这样会少判断元素
                sum+=(n%10)*(n%10);
                n = n / 10;
            }
            if(sums_set.find(sum)!=sums_set.end()){
                return false;
            }else{
                sums_set.insert(sum);
            }
            n=sum;
        }
        return true;
    }
};

题目:1.两数之和

思路:

  1. 暴力法,枚举数组中的每一个数 x,寻找数组中是否存在 target - x。遍历,与目标值作差,在数组中寻找差值
  2. 升级,方法一时间复杂度较高在于,target-1的遍历, 所以将遍历过的值x和下标保存到一个集合,之后遍历的时候来询问这个集合 ,target-x是否遍历过。因为需要保存值和下标 所以选用map,因为无序,-》unordered_map

坑:

补充:

今日总结

标签:set,key,sum,随想录,数组,202,哈希,unordered,两数
From: https://www.cnblogs.com/bamboo2233/p/18244657

相关文章

  • 2025秋招图像处理面试题01_LBP算法原理
    问题LBP是一种常见的特征描述算法,用来提取局部的纹理特征,其原理其实很简单,下面我们就来看看它是怎么一回事吧。LBP简介LBP(LocalBinaryPatterns,局部二值模式)是一种很简单但很高效的局部纹理特征描述算子,于1994年由T.Ojala,M.Pietikäinen和D.Harwood提出,经过后续的......
  • 2024年春季学期《算法分析与设计》练习15
    A:简单递归求和题目描述使用递归编写一个程序求如下表达式前n项的计算结果: (n<=100)1- 3+5-7+9-11+......输入n,输出表达式的计算结果。输入多组输入,每组输入一个n,n<=100。输出输出表达式的计算结果。样例输入 Copy12样例输出 Copy1-2#pragma......
  • 【NOIP2023普及组复赛】题1:小苹果
    题1:小苹果【题目描述】小Y的桌子上放着nnn个苹果从左到右排成一列,编号为从11......
  • 【NOIP2023普及组复赛】题2:公路
    题2:公路【题目描述】小苞准备开着车沿着公路自驾。公路上一共有nnn个站点,编号为从11......
  • 1188 有多少零-PAT乙级真题(2024夏季B-3)-极简代码-C++
    B-3有多少零给定 n 个正整数,请你数数它们的乘积的末尾有多少个零。例如26、225、48的乘积是280800,末尾有2个零。输入格式:输入给出一个不超过 10^6 的正整数 n,下一行给出 n 个不超过 10^6 的正整数。输出格式:在一行中输出给定的 n 个正整数的乘积末尾零的......
  • 创k 嵌入式开发2024
    经过在创k的嵌入式开发课程学习,我获得了宝贵的知识和实践经验。以下是我对课程内容和学习成果的总结:课程内容回顾//下栽のke:yydsit_come/course/detail/1249286274804142498C语言基础:掌握了C语言的基本语法、数据结构和编程技巧,为后续的嵌入式开发打下了坚实的基础。Linux......
  • 字节跳动基础架构两篇论文入选 VLDB 2024
    2024年8月26至30日,VLDB2024将在中国广州举行。字节跳动基础架构云原生中间件团队、批式计算团队研究成果分别被VLDB2024接收,并受邀进行现场报告。VLDB(InternationalConferenceonVeryLargeDataBases)是数据库三大国际顶级学术会议之一,也是中国计算机学会(CCF)推......
  • 202406-如何使用新版本的rclone在服务器上挂载onedrive e5
    前情提要:这位老哥里面写的教程,因为rclone更新了所以有点不一样了,仅作记录在本地(带浏览器)操作Noremotesfound,makeanewone?n)Newremotes)Setconfigurationpasswordq)Quitconfign/s/q>nEnternamefornewremote.name>odOptionStorage.Typeofstorage......
  • React常见面试题(2024最新版)
    创建项目npxcreate-react-appmy-app启动项目npmstart目录结构目录/文件名描述README.md项目的自述文件node_modules/项目依赖包存放目录package.json包管理配置文件,记录项目信息和依赖package-lock.json锁定依赖版本,确保跨环境一致性pub......
  • 代码随想录算法训练营第三十六天 | 406.根据身高重建队列
    406.根据身高重建队列题目链接文章讲解视频讲解思路:  先按照身高由大到小排序,如果身高相同,比较人数(由小到大);  按照人数重构数组,将节点插入到合适的位置classSolution{private:staticboolcompareByK(vector<int>&lhs,vector<int>&rhs){if(lhs[......