当前位置: 首页 > news >正文

【454. 四数相加 II】

题目:

给你四个整数数组 nums1、nums2、nums3 和 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

提示:

  • n == nums1.length
  • n == nums2.length
  • n == nums3.length
  • n == nums4.length
  • 1 <= n <= 200
  • 228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228

思路:

本题乍眼一看好像和0015.三数之和,0018.四数之和差不多,其实差很多。

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

而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!

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

本题解题步骤:
首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中。
定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
再遍历nums3和nums4数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
最后返回统计值 count 就可以了


代码:

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> map1;   // key存放nums1和nums2中的元素之和,value存放元素之和的值出现次数for(auto num1 : nums1) {for(auto num2 : nums2) {map1[num1 + num2]++;}}int count = 0;  //统计nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0的次数// 再遍历nums3和nums4,如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。for(auto num3 : nums3) {for(auto num4 : nums4) {if(map1.find(0 - (num3 + num4)) != map1.end()) {count += map1[0 - (num3 + num4)];}}}return count;}
};

总结:

时间复杂度: O(n^2)
空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2

而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案中不可以包含重复的四元组


参考:

代码随想录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【设计模式-外观】
  • 解密AI创作:提升Prompt提示词的提问技巧
  • 《Google软件测试之道》笔记
  • 软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)
  • VMware网络配置
  • Redis的C客户端(hiredis库)使用
  • 深入解析:如何通过网络命名空间跟踪单个进程的网络活动(C/C++代码实现)
  • PostgreSQL的walsender和walreceiver进程介绍
  • ubuntu20.04/22.04/24.04 docker 容器安装方法
  • 借助大模型将文档转换为视频
  • 【测试开岗面试】知识点总结
  • JDBC笔记
  • UE5源码Windows编译、运行
  • 办了房屋抵押经营贷,空壳公司不怕被查吗?续贷不上怎么办?
  • Chrome谷歌浏览器登录账号next无反应
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • co.js - 让异步代码同步化
  • cookie和session
  • Fabric架构演变之路
  • gf框架之分页模块(五) - 自定义分页
  • Js基础知识(四) - js运行原理与机制
  • Linux gpio口使用方法
  • rabbitmq延迟消息示例
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • tensorflow学习笔记3——MNIST应用篇
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 批量截取pdf文件
  • 前端存储 - localStorage
  • 前端设计模式
  • 推荐一个React的管理后台框架
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • const的用法,特别是用在函数前面与后面的区别
  • 选择阿里云数据库HBase版十大理由
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​浅谈 Linux 中的 core dump 分析方法
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #Linux(make工具和makefile文件以及makefile语法)
  • #stm32整理(一)flash读写
  • (待修改)PyG安装步骤
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)c52学习之旅-中断
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)jQuery 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 高效开发之不可错过的实用工具
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net的socket示例
  • .NET业务框架的构建