Leetcode 454-四数相加 II

本文介绍了解决Leetcode 454题-四数相加 II 的方法。通过将问题转化为两个数组的和与另外两个数组的和相等的形式,并利用哈希表来提高查找效率。具体实现上,先通过双重循环建立哈希表存储前两个数组的所有可能和,再通过遍历后两个数组检查是否存在匹配项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

在这里插入图片描述

题解

看到形如:A+B…+N=0的式子,要转换为(A+…T)=-((T+1)…+N)再计算,这个T的分割点一般是一半,特殊情况下需要自行判断。定T是解题的关键。

此外,可以考虑用到哈希表

注意本题与Leetcode 18-四数之和有区别,18题是同一个数组,所以要用到两重双指针,而本题是四个数组,直接使用哈希表即可
题解可参考编程文青李狗蛋

  1. hashmap 存储第一个数组的两数之和作为key(利用双层循环),两数之和出现的次数作为value
    在这里插入图片描述

  2. 第二个数组利用二重循环计算两数之和temp,在map中查找是否存在0-temp以及出现次数

//两层for循环,map1记录nums1+nums2的全部值组合,O(ab)
//两层for循环,计算nums3+nums4的全部值组合,O(cd)
//在map1查找是否存在-(nums3[i]+nums[j])
//时间复杂度O(ab)+O(cd)
//两两组合是为了避免出现O(abc)+O(d)的时间复杂度
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        HashMap<Integer,Integer> map=new HashMap<>();
        int res=0;
        //不需要下标时这样写比较简洁
        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){
                if(map.containsKey(0-i-j)){
                    //不仅要判断有没有,还要判断出现次数
                    res+=map.getOrDefault(0-i-j,0);
            }
        }
    }
    return res;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值