代码随想录——哈希表 刷题记录

文章讨论了哈希表在查找、计数和去重等场景中的运用,如判断元素是否存在、字母异位词的检测、数组交集的计算,以及如何利用Set和List等数据结构优化问题解决方案。特别提到哈希表的使用注意事项,如处理无限循环和元素去重的方法。
摘要由CSDN通过智能技术生成

哈希表

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

242.有效的字母异位词

用哈希表存储每个字母及对应的数量,代码随想录用了26字母的数组解决,我用的HashMap记录s,再遍历t,减掉t中字母后得到最后的HashMap

349.两个数组的交集

HashMap和HashSet的关系

  1. HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。
  2. HashMap的key就是放进HashSet中对象,value是Object类型的。
  3. 当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量
// 创建,HashSet是无序集合
Set<Integer> set1 = new HashSet<>();
// 遍历
int i = 0;
for (int j: ansSet){
	ans[i] = j;
    i++;
}

Set里的元素不重复!!!

383.赎金信

可以直接用哈希表,也可以用长为26的数组计数,用数组比较省时高效。

49.字母异位词分组

List是个接口,并不能直接用来实例化,如果要使用,必须去实例化List的实现类

List<String> list = new ArrayList<String>();

哈希表键:字符串,值:字符串对应异位词的list

438.找到字符串中所有字母异位词

判断两个hashmap是否有包含关系时,不要把形参删除或添加,会改变原始hashmap的值
有点难,可以回头再做一遍

349.两个数组的交集

不计数只出现一次可以用Set

350.两个数组的交集II

由于Set元素不重复,需要重复且长度不确定时可以用List,但创建对象需要用ArrayList。

202.快乐数

如果有无限循环的情况,那就是结果之前有出现过,可以用Set存储每一轮的和。

1.两数之和

可以往Map中添加未配对的数和其下标,key为元素,value为对应数组下标,计算每个值对应的另一个加数,在Map中查找加数即可。

454.四数相加II

和上题类似,不过可以统计前两个数组的和记录到Map中,再求后两个数组的和,在Map中找另外的加数。

15.三数之和

采用双指针法,确定遍历的i和left=i+1,right=len-1,进而确定三位数
注意去重时要与前面的数字对比,不要和后面的对比
可以重做

  • 把数字转化成数组的方法
Arrays.asList(nums[i], nums[left], nums[right])

18.四数之和

和上题类似,不过多加一个遍历第二个数的循环,注意(long)强制类型转换

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值