代码随想录算法训练营第七天|哈希表 454、383、15、18

文章讨论了在编程中如何利用哈希表优化数组操作,如求和、计数、去重和3sum问题的解决方案,强调了迭代、边界条件和避免溢出的重要性。
摘要由CSDN通过智能技术生成

454:

代码随想录

第一次做。刚开始的思路是把四个数组都放进各自的哈希表里然后进行操作,但这样的话和暴力解法的区别不大,都要四个for循环套在一起遍历。

看了题解的前两步稍微有点眉目了:把ab数组的和放进哈希表里,key是和,value是出现的次数。然后再遍历cd数组,用0减去cd的和,并在哈希表里查找是否存在符合的数值。

但有个很关键的点就是计算有效结果数时是允许数值相同的元素的,也就是说哈希表中每一个符合条件的key出现的每一次(也就是value)都是有效的,在统计结果时要将所有key的value相加而不是每找到一个key就+1。

383:

代码随想录

一开始的思路是把ransom用哈希表记录,然后减去magazine里的字母出现的次数。写完之后发现用数组会更简洁,只不过需要反过来记录。

关键点是要搞明白return true和false的分界点在哪里。一开始我写的是只要数组里有不等于0的数就return false,但这样忽略了magazine里特定字母数大于所需要的数量(这种情况下由于有冗余,特定字母的计数会是大于0的),正确的false条件是某所需字母的位置的数字小于0。

15:

代码随想录

难。一上来就不是很有思路。看了题解的第一句话尝试去用双指针来想,没有想到在left和right的基础上加一个 i 来遍历查找。

看了题解的整体思路,实现了能解决没有重复元素的数组的代码,最难的还是去重。

首先是给 i 去重:我的大体思路和题解一致,但是忘记了continue的用法,使用的是需要去重时 i++,这就导致很容易使后面的left超出数组的边界。用continue的话可以直接退出当前循环直接开始下一个数的循环。

找到有效结果之后需要让left和right同时缩进一次,因为他们的当前值已经被记录了。

然后是给left和right去重:重点是必须要在找到并记录有效结果之后再给left和right去重,否则会漏掉有效结果。并且在移动到各自的最后一个重复元素之前要一直移动,所以这里用while-loop。

18:

代码随想录

这是一个升级版的3sum,虽然只是多套一层for-loop,但是细节多了不少,需要注意:

  • 初始化 i 之后的遍历指针时,要注意如何正确初始化(比如这道题 j = 1就不行,必须是 j = i + 1。
  • 给非left和right的遍历指针去重时,用continue!不要用 ++ !
  • 给非left和right的遍历指针去重时,一定要在各自的for-loop里面操作,不要窜位。
  • 在给第一个之后的遍历指针去重时( i 之后就是j、k等)一定要注意去重的条件(比如这道题里 j 的去重条件之一就必须是 j > i + 1。
  • 在数值会很大的时候,把sum转换成long 或者 用剪枝提前退出的办法来防止overflow。
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值