Day07454.四数相加、383.赎金信、15.三数之和、18.四数之和

本文讨论了解决四数相加和赎金信问题的编程思路,包括使用map进行计数和数组哈希优化的方法,以及提及的三数之和和四数之和的剪枝去重技巧。
摘要由CSDN通过智能技术生成

Day07:454.四数相加、383.赎金信、15.三数之和、18.四数之和

454.四数相加

原题链接:

454.四数相加
代码随想录链接:

代码随想录

这道题因为有四个整数数组,并且长度相等,结果集内可以有相同的元素,所以这道题不用去进行复杂的剪枝和去重操作。

思路如下:

  • 先定义一个map集合,双层for循环遍历前面两个数组,把前面两个数组的数之和放入到map集合中,key值为和,value值为该和出现的次数;
  • 之后再使用双层for循环遍历后面两个数组,如果map中能找到0减去遍历的两个数组之中的数,说明找到了一组正确的结果,这个时候结果result加0,最后再返回result即可;

Java源代码如下:

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int result = 0;
        Map<Integer,Integer> map = new HashMap<>();
        for(int i : nums1){
            for(int j :nums2){
                map.put(i+j,map.getOrDefault(i+j,0)+1);
            }
        }

        for(int i : nums3){
            for(int j : nums4){
                result += map.getOrDefault(0-i-j,0);
            }
        }
        return result;
    }
}

383.赎金信

原题链接:

383.赎金信

代码随想录链接:

代码随想录

这一题我是使用map去做的,但是做出来之后时间空间都消耗很大,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了,于是去看了代码随想录的解析

发现卡哥的解析是使用了数组的哈希法应用,瞬间一拍脑袋说我怎么没想到,于是自己回去用数组重写了一遍,发现真的简单很多,整体思路如下:

  • 先定义一个大小为26的整数数组用来存放每个字符出现的次数
  • 之后遍历一遍magazine这个字符串,把里面的字符出现的次数加入数组
  • 然后遍历一遍ransomNote这个字符串,里面的字符出现一次,对应数组的位置数-1
  • 最后遍历整数数组,如果发现数组内有数小于0,说明magazine不能包含ransomNote,返回false,for循环外返回true;

Java源代码如下:

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if(ransomNote.length() > magazine.length()){
            return false;
        }

        int[] result = new int[26];

        for(char c : magazine.toCharArray()){
            result[c - 'a'] += 1;
        }

        for(char c : ransomNote.toCharArray()){
            result[c - 'a'] -= 1;
        }

        for(int i : result){
            if(i < 0){
                return false;
            }
        }

        return true;
    }
}

15.三数之和、18.四数之和

这两题太难了,我第一次听到剪枝和去重的操作,建议大家去看卡哥的B站讲解视频,这里给出链接:
15.三数之和
18.四数之和
卡哥三数之和B站讲解视频
卡哥四数之和B站讲解视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值