代码随想录算法训练营第六天|哈希基础,242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希 我的最爱。足够的简单粗暴,没有数学上繁琐的思考(进阶版的哈希函数除外哈)

只要看到需要保存数据才能进行之后的搜索判断类题目,都可以第一时间想到哈希map or set.

哈希原理

之前一直觉得很晦涩难懂,后来发现可以先从熟悉简单的操作开始了解,之后再往深处挖掘反而会让自己更快的熟悉hash
把任何东西变成hash 主要分2步:(脑补ing宋丹丹老师的强调,哈哈

  1. 把word(可以是数字,字母,字符串etc)通过hascode变成int : hashCode(word) :原因很简单,之后要对他进行计算才能放到相应的位置

  2. 对得到的这个code 进行compression function, hash 存在的意义就是可以去压缩整个. 之后通过取模计算(在一种特殊情况下如果key是一个有规律的数列,那取模计算后很有可能所有的数字都放在了一个bucket里,这样big(O)又会变成O(n),大部分情况暂且是不用考虑的,但是如果还是担心有这种风险,最好shuffle一下自己的输入)

如上所述,按照这样放,肯定会有一定的概率,2个code被分到了同一个bucket里,就会出现不可避免地哈希碰撞(hash collision)
对于这个我们有2种方法:
1:后面放一个链表,一个个把有冲突地key value pair(一定要是k-v Pair 嗷!要不没有index来帮助你去搜索) 接在后面,有冲突就去bucket里找即可
2:第二种用的很少,实现过程是将有冲突地直接依次向下排,这样久要求了hash table的尺寸一定要大于算出来的code 的size,但是大多少也是个未知数,应该会有一个建议值,但是我还是直接建议用第一种方法把 也比较直观 :)

最后我想记下我在写HASH表类型题目的一个小心得,就刷题来说,一般都是存大写或者小写的字母,这样我们可以直接用一个长度为 24 的数组存储,计算机管理array还是方便的,况且JAVA的hashmap 方程还挺长,着实不方便TT

下面就开始今日的题目辣,竟然都做过一遍了,那就是n刷辣! 希望自己可以逻辑跟得上,写的快些
简单题就重拳出击!

242.有效的字母异位词
简单粗暴,一个字典存储+1,另一个再去从字典中拿出来-1,一旦有-1 出现,就意味着有不不一样的字符出现了
这个题目很简便的想法就是因为都是lowercase直接用一个26位数组存储即可

不管做多少遍,都会记不住corner case,也就是这两个string必须相等!必须相等!必须相等!!

349. 两个数组的交集
首先也是搜索第一个数据,构成字典后再遍历第二个输入,这道题主要是不能有重复,所以用hashSet 一步到位,啥也不说!

202. 快乐数
这就是心痛的感觉吗 TT
一刷完全不会,二刷终于会取模取余了,三刷不知道如何让数字不停的进入循环,然后及时知道什么时候应该停止
后续: 好家伙跑去看了题解来不及写解释辣!先发布,明天重新做一遍补上![此处是坑勿踩 哈哈哈]

15.三数之和
三数的数学逻辑很简单,将 0 - 第一个数字 作为 两数之和需要的target number. 然后放到twosum 就好。
主要是去重的逻辑让我生不如死:

  • 第一个重复是 第一个选出来的数字和后面2数中的一个数字相同, 这样的话,我就一直想不明白那我如何去进行筛选呢? 后来琢磨发现其实是我的逻辑就有错误, 拿力扣官方例子来说:
    [4,-1,-1,0,1,2] 第一个 -1 和后面的 0 1, 第二个 -1 和后面的 0 1 都是合格的状态,那咋办,我一开始想的每一次遍历都要和它后面的数相比,如果相同就跳过去,结果发现不对嗷,这样 -1 -1 2这个可能岂不是就被我跳过去了。最后看了题解发现既然不能和后面一个比较, 那就再遍历的时候和前面的一个数字比较,因为一旦和前面的一样,那说明结果刚刚已经找到了,已经被放到res中了,这样他就可以妥妥的直接跳过了。窃喜之余,就开心的提交了,然后就发现我忘记考虑后面的2个数字如果重复该怎么办了TT。就又开始陷入了沉思:
  • 一开始我想的很简单,想着左右指针移动前,先加上一个while循环去判断指针是否和之前那个相等,相等就继续跳指针。果不其然又错了:第一个错误的地方就是如果指针的跳转只放在while中,那要是不相等,那岂不就陷入死循环了?!所以赶紧在while循环开始的时候对双指针就进行操作。然后发现还是不对嗷!因为进入之前已经跳过了指针,那循环里比较的数字Index就发生了变化,他应该还是和前面一个比较(在这个例子中[-2,0,0,2,2], 就是index = 2 和 Index =1 两个数进行比较)所以是left == left - 1 之间的比较。

总结来说,3数逻辑不难,主要是去重要知道,其中会有2种重合状态,而这2个重合可能出现在2个地方,所以就对应进入循环之前的去重,和进入之后的去重(分别对应着上面我所写的情况)

1. 两数之和
这个太简单就不说辣。跳过

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值