代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和

刷题建议

刷题建议与debug

  1. 代码随想录目前基本都有了视频讲解,一定要先看视频,事半功倍。
  2. 写博客,将自己的感悟沉淀下来,不然会忘
  3. 大家提问的时候,记得要把问题描述清楚,自己在哪一步遇到了问题,做了哪些调试,而不要只是把代码甩出来,这样方便大家帮忙快速定位问题。

博客内容:(博客记录以及打卡格式)

今日学习文章链接和视频链接

Python菜鸟教程

哈希表理论基础

大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。

  1. hash表(散列表)一般哈希表都是用来快速判断一个元素是否出现集合里
  2. hash函数:通过hashCode把名字转化为数值
  3. hash碰撞:小李和小王都映射到了索引下标 1 的位置,这一现象叫做哈希碰撞,解决方法有线性探测法和拉链法
  4. hash结构:比如字典,集合等()了解原理
  5. 用法:空间换时间,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
    代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和_第1张图片

454.四数相加II

自己看到题目的第一想法

  1. 暴力破解==》明显不行,应该会超时

看完代码随想录之后的想法

  1. n的四次方是不能接受的,那么可以将a+b的值作为一个整体,遍历后存入map,map的key是value,map的值是出现的次数,这相当于巧妙利用Hash
  2. 然后遍历C和D,如果0-(c+d)在map中出现过的话,那么它出现的次数为x,count += x
  3. return count

自己实现过程中遇到哪些困难

  1. 字典默认为空,不是0,所以要单独判断,如果n1 + n2不在hashmap里面,hashmap[n1+n2] = 1

相关题目

383. 赎金信

自己看到题目的第一想法

  1. hashmap,key是字符,value是出现的次数

看完代码随想录之后的想法

  1. 思路正确,但是字典操作错误
  2. 可以用数组,因为都是小写字母
  3. 注意先遍历谁,想清楚

15. 三数之和

自己看到题目的第一想法

  1. 应该是要用Hash,遍历a和b,放在hashmap里面,最后c=-a-b
  2. hashmap[-a-b]是否存在,但是需要去重,abc都需要去重
  3. 无思路

看完代码随想录之后的想法

  1. 先排序,从小到大排序
  2. 关键逻辑在于去重
  3. 双指针思路->遍历i,left=i+1,right=size-1,后left和right相向移动,left不能等于right(题目要求,i,left和right不相等)
  4. 在拿到一个三元组后要对right和left进行去重

自己实现过程中遇到哪些困难

  1. 不明确在找到第一个三元组后,代码上怎么对left和right进行去重

今日收获,记录一下自己的学习时长

  1. 遇到问题:看下描述除了暴力,能否用Hash和双指针解决?Hash的话选择数组,set还是dict?
  2. 如果先排序的话是否能够更加容易解决问题
  3. 注意循环结束条件,边界条件,如何去重
  4. 注意这里能用双指针法因为需要的是value,需要排序,但是拍完序后索引就乱了,所以如果需要索引的,不能用这种思路

18. 四数之和

自己看到题目的第一想法

看完代码随想录之后的想法

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

你可能感兴趣的:(算法,散列表,哈希算法)