代码随想录Day5|哈希表理论知识|242.有效的字母异位词| 349. 两个数组的交集|202. 快乐数|1. 两数之和

一刷是用Python写的,所以在哈希表的三种结构那里有点区别

哈希表(Hash table,散列表)

  • 官方解释:哈希表是根据关键码的值而直接进行访问的数据结构
  • 例如数组就是一个哈希表,关键码就是下标索引,通过关键码下标访问数组元素
  • 应用:快速判断元素是否出现在集合中
  • 创造哈希表:哈希函数(hash function)
  • 以下说明以,判断学生姓名是否在该所学校中为例

哈希函数

  • 哈希函数作用:把学生姓名映射为哈希表上的索引,以便于通过查询索引判断学生是否在学校中

  • hashCode:通过特定编码方式,将其他数据格式转化为不同的数值

  • 特殊情况:①hashCode数值大于哈希表大小(tablesize):对数值取模

    ​ ②学生数量大于哈希表大小:有几位学生名字同时映射到哈希表的同一个下标索引中,引出哈希碰撞

哈希碰撞

  • 当小李和小王都被映射到了索引下标1的位置时,称为:哈希碰撞
  • 解决方法:拉链法、线性试探法
  • 拉链法
  • 线性试探法

常见的三种哈希结构

  • 数组
  • set集合
  • map映射

总结

  • 遇到了要快速判断一个元素是否在集合里时,应用哈希法
  • 哈希法牺牲了空间换取了时间,需要额外的数组、set、map来存放数据

242.有效的字母异位词

  • ascii码中的大写字母从65开始,小写字母从97开始,48~57为0-9的阿拉伯数字
  • 我用了两个数组来依次记录两个数组的哈希表,然后比较是否相等;卡尔则只用一个数组,遍历一个字符串记录,遍历另一个字符串删减,最后判断数组是否全为0
    拓展题目
    • 383.赎金信,同242
    • 49.字母异位词分组,没写出来,官方答案用的是unordered_map<string,vector<string>> mp数据结构,对字符串排序sort(key.begin(), key.end()),插入元素mp[key].emplace_back(str);迭代器for(auto it = mp.begin(); it != mp.end(); ++it
    unordered_map<string, vector<string>> mp;
    for(string& str : strs){
    	string key = str;
    	sort(key.begin(), key.end());
    	mp[key].emplace_back(str);
    }
    vector<vector<string>> ans;
    for(auto it = mp.begin(); it != mp.end(); ++it){
    	ans.emplace_back[it->second);
    }
    return ans;
    
    • 438.找到字符串中所有字母异位词,滑动窗口+哈希表,int数组不能直接判断是否相等

349. 两个数组的交集

  • 正常用数组做没问题
  • 这道题主要要学习unordered_set这种哈希数据结构
    unoedered_set<int> result_set
    result_set.finid(找元素)
    vector<int>(result_set.begin(), result_set.end()) //set转vector
    拓展题目
    • 350.两个数组的交集||

202. 快乐数

  • 首先,如何将数字n(如2453)变换为数字2、4、5、3就遇到了问题,用n%10
  • 写个函数计算sum
  • 用set哈希表记录该sum是否出现过,是否进入循环了
unordered_set<int> result_set; //创建新set
while(result_set.find(n) == result_end())     //循环条件:查找set中是否有n元素,
                                              //若没有则返回set末尾的迭代器
result_set.insert(n);    //插入元素

1.两数之和

  • 用map数据结构,定义:unordered_map<int,int> map;
  • 寻找元素:auto iter = map.find(n);
  • 找不到就返回map.end()
  • 插入元素map.insert(pair<int, int>(nums[i], i);
  • 需要学习set、map的用法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值