LeetCode:454. 四数相加 II

简介: 题目描述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i, j, k, l < nnums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

🍎道阻且长,行则将至。🍓


🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


hash是什么,哈希表为什么叫哈希表?

image.png

一、🌱454. 四数相加 II

  • 题目描述:给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

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

  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:

n == nums1.length
n == nums2.length
n == nums3.length
n == nums4.length
1 <= n <= 200
-2^28 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 2^28

  • 示例 1:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:两个元组如下:
1.(0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2.(1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

🌴解题

哈希表

4个数组如果使用暴力解法就需要4层for循环,那时间复杂度将是O(n^4^)。
所以和上一题LeetCode:1. 两数之和类似,本题还是可以使用哈希表。我们可以把四个数组分为两个组,分别对每个组求和(时间复杂度O(n^2^) ),将第一组求和结果加入到mapkey中,value就是出现的次数。第二组就用于寻找map中是否有相反数,最后统计次数返回。

  • code
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if(!map.containsKey(nums1[i]+nums2[j])){
                    map.put(nums1[i]+nums2[j],1);
                }else{
                    map.put(nums1[i]+nums2[j],map.get(nums1[i]+nums2[j])+1 );
                }
            }
        }
        int ans=0;

        for (int i = 0; i < nums3.length; i++) {
            for (int j = 0; j < nums4.length; j++) {
                if(map.containsKey(-(nums3[i]+nums4[j]))){
                    ans+=map.get(-(nums3[i]+nums4[j]));
                }
            }
        }

        return ans;
    }
}

image.png


鹤鸣亭绝句四首 · 辛弃疾


饱饭闲游绕小溪,却将往事细寻思。


有时思到难思处,拍碎阑干人不知。

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

相关文章
EMQ
|
传感器 监控 网络协议
使用 Neuron 接入 Modbus TCP 及 Modbus RTU 协议设备
作为一款支持数十种工业协议转换的物联网边缘工业协议网关软件,Neuron也已经实现了基于Modbus RTU协议TCP传输的功能。本文将在Ubuntu 20.04.3、X86_64的环境下,介绍如何使用Neuron接入Modbus TCP及Modbus RTU协议设备。
EMQ
829 0
使用 Neuron 接入 Modbus TCP 及 Modbus RTU 协议设备
|
算法 测试技术 C#
C++前缀和算法的应用:统计得分小于K的子数组数目
C++前缀和算法的应用:统计得分小于K的子数组数目
|
9月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1075 67
|
12月前
|
存储 安全 Java
Go语言中的map为什么默认不是并发安全的?
Go语言的map默认不保证并发安全,以优化性能和简洁性。官方建议在需要时使用`sync.Mutex`保证安全。从Go 1.6起,并发读写map会导致程序崩溃,鼓励开发者显式处理并发问题。这样做的哲学是让代码更清晰,并避免不必要的性能开销。
123 0
|
9月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
909 0
|
运维 应用服务中间件 Linux
Tomcat详解(九)——Tomcat虚拟主机配置实战
Tomcat详解(九)——Tomcat虚拟主机配置实战
246 1
|
数据采集 编解码 人工智能
MAVEN-ERE一个新的事件关系检测数据集
真实世界事件之间的各种关系,包括共指、时间、因果和子事件关系,是理解自然语言的基础。
411 1
|
JavaScript 前端开发
【JavaScript】面试手写题精讲之数组(上)
该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了,突然面试官冷不丁来一句有没有更优的解法,直接让我们僵在原地。为了解决兄弟们的这些困扰,这个专题于是就诞生啦。我们会将一些常见的不是最优解的答案作为对比,方便大家更好理解。
97 3
数据结构单链表之删除给定位置的链表节点 | 第五套
数据结构单链表之删除给定位置的链表节点 | 第五套
182 0
java中Map根据key排序,根据value排序
HashMap根据key或value排序(stream流操作)