四数相加力扣--454

ops/2025/1/15 15:51:48/

目录

题目

思路

代码 


题目

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

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

示例 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

示例 2:

输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1

思路

先遍历前两个数组,得到两数相加a,然后遍历后两个,得到b,看0-a是否在等于b,即在集合中查找是否有某个元素,所以想到用哈希表

元组:可用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。

哈希表的三种结构:有数组,set,map

  • 不可用数组:因为题目中所给是元组,元组可以存放任意数据类型,他的长度不固定,如果用数组的话长度无法确定,所以无法用数组
  • 不可用set,我们在存储时,不仅要你存储出现了那些数字,还要存储他们出现的次数,而set只能存储出现过什么,不可以存储出现次数
  • 综上,使用map

map中key存储出现的次数和,value存储出现的次数 

为什么要先遍历前两个数组 ,再遍历后两个数组?

遍历前两个数组时,时间复杂度为n^2,遍历后两个数组时候时间复杂度也为n^2,算法总体时间复杂度为n^2

如果我们先遍历第一个数组,然后再遍历后三个数组, 遍历第一个数组时间的复杂度为n,后三个为n^3,算法总体时间复杂度为n^3,

所以两个两个更优。

易错点

如果0-a等于b,那么count不应该+1,而是应该加value,举例即可明白。

代码 

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res=0;//统计最后符合条件的个数Map<Integer,Integer> map=new HashMap<Integer,Integer>();//定义一个mapfor(int i:nums1){//遍历前两个元素for(int j:nums2){int a=i+j;//得到两数之和amap.put(a,map.getOrDefault(a,0)+1);//键:a,如果没有存放过这个键,那么这个键的初始值为1,如果有,那么把他的键取出,j+,在放入map中
//对 map 中以 sum 为键的值进行计数操作。它会检查 map 中是否已经存在键为 sum 的项,如果存在,则将其对应的值加 1;如果不存在,则将 sum 作为键添加到 map 中,并将其值初始化为 1。}}for(int i:nums3){//遍历后两个数组for(int j:nums4){res+=map.getOrDefault(0-i-j,0);
//将 map 中键为 0 - i - j 的值累加到变量 res 中。如果 map 中不存在键为 0 - i - j 的键值对,那么将使用默认值 0 进行累加操作。}}
return res;}
}


http://www.ppmy.cn/ops/150326.html

相关文章

初学者如何用 Python 写第一个爬虫?

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

学习进程前的简单认知-体系结构与OS

冯诺依曼体系结构&#xff08;von Neumann architecture&#xff09; 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器。大部分都遵守冯诺伊曼体系。 这种体系结构的核心思想是将程序指令和数据存储在同一存储器中&#xff0c;并通过控制单元…

Java Web开发进阶——WebSocket与实时通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;广泛应用于需要实时数据交换的应用程序中。它能够实现服务器与客户端之间的双向通信&#xff0c;避免了传统 HTTP 请求/响应的延迟。结合 Spring Boot&#xff0c;开发实时通信应用变得更加高效与简便。 1. …

《Opencv》图像金字塔与采样

目录 一、简介 二、图像金字塔简介 三、上采样与下采样的原理 1. 下采样&#xff08;Downsampling&#xff09; 2. 上采样&#xff08;Upsampling&#xff09; 四、代码实现 五、结果展示 ​编辑 ​编辑 六、代码解析 1. 图像读取 2. 下采样 3. 上采样 4. 结果显示…

多身份定制化视频创作的新突破! Ingredients:可将多个特定身份照片整合进视频创作实现个性化视频生成。

在当今这个数字内容爆炸的时代&#xff0c;视频创作已成为连接人与人、传递信息与情感的重要桥梁。然而&#xff0c;如何高效、高质量地实现多身份定制化视频创作&#xff0c;一直是视频制作领域的一大挑战。近日&#xff0c;北京昆仑研究院的研究团队提出了一种名为“Ingredie…

从源码角度分析SpringMVC执行流程

文章目录 一、SpringMVC基本概述二、SpringMVC的执行流程三、SpringMVC源码的执行流程四、前端控制器根据请求获取处理器原理五、如何根据处理器获取处理器适配器六、SpringMVC拦截器执行源码解读七、处理器适配器执行方法原理 一、SpringMVC基本概述 SpringMVC是基于Servlet进…

手动实现一个循环顺序队列

#include <iostream>using namespace std;class Queue { private:int data[1024]; // 存储元素的数组int frontIndex; // 头指针int rearIndex; // 尾指针int size; // 当前队列中的元素个数public:// 构造函数Queue():frontInde…

使用 C# 制作图像的特写窗口

许多网站都会显示一个特写窗口&#xff0c;其中显示放大的图像部分&#xff0c;以便您可以看到更多细节。您在主图像上移动鼠标&#xff0c;它会在单独的图片中显示特写。此示例执行的操作类似。&#xff08;示例使用的一些数学运算非常棘手&#xff0c;因此您可能需要仔细查看…