代码随想录阅读笔记-哈希表【四数相加II】

题目

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。

为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。

示例

输入:

  • A = [ 1, 2]
  • B = [-2,-1]
  • C = [-1, 2]
  • D = [ 0, 2]

输出:

2

解释

两个元组如下:

  1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
  2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0

思路

本题乍眼一看好像和力扣上三数之和,四数之和差不多,其实差很多。

本题是使用哈希法的经典题目,而那两题并不合适使用哈希法,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。

而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况。

如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案中不可以包含重复的四元组,大家可以思考一下。

本题的关键是将四个数组两两分组,不然四个数组直接处理会嵌套四个for循环,时间开销非常大,所以考虑两两分组,然后思路类似之前发的那个两数相加的题目,只不过需要定义一个哈希map,存放前两个数组的所有相加的可能值以及所有可能值出现的次数,这样的话,只需要用剩下两个数组同时遍历(两个for)去map中寻找相加为0的可能性,找到之后将count加上对应map中的键值,即次数即可,具体步骤和代码如下。

本题解题步骤:

  1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了

C++代码如下:

class Solution {
public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数// 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中for (int a : A) {for (int b : B) {umap[a + b]++;}}int count = 0; // 统计a+b+c+d = 0 出现的次数// 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。for (int c : C) {for (int d : D) {if (umap.find(0 - (c + d)) != umap.end()) {count += umap[0 - (c + d)];}}}return count;}
};
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Formate函数的一般使用

Program Project2;{$APPTYPE CONSOLE}UsesSysUtils;Varnum: Integer;r1: Real;BeginRead(num, r1);Writeln(Format(%d 绝对值%%d&#xff1a;%d, [num, abs(num)]));Writeln(Format(%u 绝对值%%u&#xff1a;%u, [num, abs(num)]));Writeln(Format(%f 参数为浮点数&#xff0c;…

前后端分离:现代Web开发的协作模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

el-cascader修改样式(不影响全局)

当用/deep/想像往常一样修改&#xff0c;会发现不生效&#xff0c;原因在于这个组件和div#app同级了&#xff0c;如果去掉scoped&#xff0c;是最简单的方法&#xff0c;当然&#xff0c;为了不影响全局我们当然不能这么做。 以下是步骤&#xff1a; 1.我们查看组件属性&…

镜像制作实战篇

“ 在失控边缘冲杀为&#xff0c;最终解脱” CMD与EntryPoint实战 EntryPoint 与 CMD都是docker 镜像制作中的一条命令&#xff0c;它们在概念上可能有些相似&#xff0c;但在使用中&#xff0c;两者是有明显的区别的。比如&#xff0c;执行一个没有调用EntryPoint、CMD的容器会…

Rust基础知识讲解

Rust 的背景和设计理念 Rust 是一种系统编程语言&#xff0c;旨在提供高性能、内存安全和并发性。它由 Mozilla 研究院开发&#xff0c;第一个正式版本&#xff08;1.0&#xff09;发布于 2015 年。Rust 的设计融合了静态类型语言的性能和安全性&#xff0c;以及现代语言的便利…

#QT(事件--快捷键保存文件)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;QEvent,QMouseEvent,QKeyEvent。 在上一个文本编辑器的基础上实现快捷键"ctrls"保存文件。 3.记录 &#xff08;1&#xff09;查看QEVENT的有效事件 &#xff08;2&#xff09; 所有时间均继承于QEvent&#xff0c;任…

微信小程序《简单、快速上手的微信小程序音乐播放器》+源代码+文档说明

文章目录 源代码下载地址项目介绍项目功能使用方法界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 首页&#xff1a;歌曲歌手搜索&#xff0c;轮播图&#xff0c;各大榜单&#xff0c;热门歌单 正在播放&#xff1a; 当前播放歌曲展示…

MySQL查询结果竖列转列为字段:深入探讨pivot操作与应用实践

在数据分析和报表生成过程中,我们经常需要将MySQL查询结果中原本竖直排列的数据转换为横向的列,也就是常说的“行列转换”或“透视(pivot)”操作。MySQL本身并未内置像Excel那样的Pivot Table功能,但这并不妨碍我们通过SQL语句的巧妙构造实现相同的效果。本文将深入探讨My…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

【C语言】strcpy与strncpy函数的使用和模拟实现

一.strcpy的使用与模拟实现 char* strcpy(char * destination, const char * source ); 使用注意事项&#xff1a; • 源字符串必须以 \0 结束。 • 会将源字符串中的 \0 拷贝到目标空间。 • 目标空间必须足够大&#xff0c;以确保能存放源字符串。 • 目标空间必须可修改。…

如何从不同维度对服务进行拆分

1.压力模型 高频高并发 商品详情页 低频突发流量 如秒杀 批量上架 2.主链路规划 不可缺少的环节 如果缺少了就无法形成完整的服务 如图营销计算就是一个服务业务 3.领域模型拆分DDD 4.用户群体拆分 2C 2B

【.net/.net core】使用System.Web.HttpUtility.UrlDecode处理web请求编码问题

问题场景&#xff1a;将数据已JSON字符串写入请求内容后&#xff0c;在接收端接收数据时&#xff0c;数据内容为URL编码后的内容&#xff0c;需要先将接收的字符串数据URL解码后才可转换为数据对象 解决办法&#xff1a;使用System.Web.HttpUtility.UrlDecode(string s)方法对…

自恋型人格如何调整

目录 1. 假期后无法快速投入工作,走不出被需求的陷阱1.1 与他人分享对调节自恋型人格有何帮助1.2 自恋型人格的一起其他问题1. 假期后无法快速投入工作,走不出被需求的陷阱 感受到被需要和价值的重要性是人之常情,尤其对于自恋型性格的人来说,这种感觉可能会更加强烈。 假…

CCF CSP试题编号: 202312-2试题名称: 因子化简

题目中提到关键词素数 我们可以尝试求一下1000以内的素数 足以表示数据 int a[1000]{0}; a[0]a[1]1;for(int i3;i<1000;i){for(int j2;j<i;j){if(i%j0){a[i]1;}}}for(int i0;i<1000;i){if(a[i]!1)cout<<i<<",";} 将素数存入数组 即可以按照题…

爬虫基本原理介绍、实现以及问题解决

爬虫基本原理介绍、实现以及问题解决 一、爬虫的意义 1. 前言 爬虫作为网络数据采集的重要工具&#xff0c;在当今互联网时代具有不可替代的作用。通过爬虫&#xff0c;我们可以获取到丰富的网络数据&#xff0c;用于各种用途&#xff0c;包括数据分析、业务决策、舆情监测等…

springboot整合swagger,postman,接口规范

一、postman介绍 1.1概述 工具下载 Postman&#xff08;发送 http 请求的工具&#xff09; 官网&#xff08;下载速度比较慢&#xff09;&#xff1a;Download Postman | Get Started for Free 网盘下载&#xff1a;百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools&#xff0c;下载go tools 报错&#xff0c; 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置&#xff0c;重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

jupyter中pip安装包会安装到别的环境。

文章目录 1. 查看jupyter当前环境和默认环境的路径和python版本2.安装包到正确的环境 如果你在 Jupyter Notebook 中使用 pip 安装包&#xff0c;它默认会将包安装到 Jupyter Notebook 所在的Python 环境。这可能会导致安装的包与你期望的环境不匹配。 1. 查看jupyter当前环境和…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…

App的测试,和传统软件测试有哪些区别?增加哪些方面的测试用例

从上图可知&#xff0c;测试人员所测项目占比中&#xff0c;App测试占比是最高的。 这就意味着学习期间&#xff0c;我们要花最多的精力去学App的各类测试。也意味着我们找工作前&#xff0c;就得知道&#xff0c;App的测试点是什么&#xff0c;App功能我们得会测试&#xff0…