代码随想录算法训练营第六天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 总结

题目: 454.四数相加II 

题目链接/文章讲解/视频讲解: 代码随想录

 第一想法:没有想出来

看完代码随想录之后的想法:可以使用哈希来解决;

我们使用的是map,因为a+b+c+d=target,我们可以看成是否存在a+b = target - (c + d);也就是说,我们遍历a , b,计算a + b,然后遍历c,d 看是否存在target - (c + d)的值等于a +b ,如果存在,就是一种情况;因此,我们把a + b 放入map中,然后遍历c ,d 两个数组,如果 发现map 包含了target - ( c + d )说明 满足条件,但是我们呢要注意存放a + b的个数;

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for(int n : nums1) {
            for(int m : nums2) {
                map.put(n + m, map.getOrDefault(n + m, 0) + 1);
            }
        }
        for(int n : nums3){
            for(int m : nums4) {
                if(map.containsKey(0 - (n + m)))
                    res += map.get((0 - (n + m)));
            }
        }
        return res;
    }
}

题目:383. 赎金信 

题目链接/文章讲解:代码随想录

第一想法:使用数组,每一次把第一个字符串放入数组,并且记录一下出现的个数,然后遍历另一个字符串,每一次都把该字符相应的次数减一,如果发现到最后,数组当中存在大于零的数,就return false

看完代码随想录之后的想法:原来数组的大小只用开到26个就行

题目:15. 三数之和 

题目链接/文章讲解: 代码随想录

第一想法:当时直接想出来了,用的是双指针,数组先排序,定一个数,然后双指针不断调整,和小的话,左指针右移,大的话,右指针左移,等于的话满足条件

自己实现过程中遇到的困难 :很容易忘记去重,我们在去重的时候,如果有重复的时候,一定先让第一个执行完后,然后跳过后面重复的,这样才能够避免漏掉的情况;

题目: 四数之和  

题目链接/文章讲解/视频讲解: 代码随想录

第一想法:和三数之和一样的思路

自己实现过程中遇到的困难 : 会发生溢出,我们要用long 型的sum,然后和target进行比较;
总结: 今天学到了剪枝操作,同时要注意溢出的问题;溢出后会回到最小值  然后再把溢出的部分加在最小值上

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值