[LeetCode] 4Sum II 四数之和之二

 

Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.

To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.

Example:

Input:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]Output:
2Explanation:
The two tuples are:
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

 

这道题是之前那道4Sum的延伸,让我们在四个数组中各取一个数字,使其和为0。那么坠傻的方法就是遍历所有的情况,时间复杂度为O(n4)。但是我们想想既然Two Sum那道都能将时间复杂度缩小一倍,那么这道题我们使用哈希表是否也能将时间复杂度降到O(n2)呢?答案是肯定的,我们如果把A和B的两两之和都求出来,在哈希表中建立两数之和跟其出现次数之间的映射,那么我们再遍历C和D中任意两个数之和,我们只要看哈希表存不存在这两数之和的相反数就行了,参见代码如下:

 

解法一:

class Solution {
public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {int res = 0;unordered_map<int, int> m;for (int i = 0; i < A.size(); ++i) {for (int j = 0; j < B.size(); ++j) {++m[A[i] + B[j]];}}for (int i = 0; i < C.size(); ++i) {for (int j = 0; j < D.size(); ++j) {int target = -1 * (C[i] + D[j]);res += m[target];}}return res;}
};

 

这种方法用了两个哈希表分别记录AB和CB的两两之和出现次数,然后遍历其中一个哈希表,并在另一个哈希表中找和的相反数出现的次数,参见代码如下:

 

解法二:

class Solution {
public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {int res = 0, n = A.size();unordered_map<int, int> m1, m2;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {++m1[A[i] + B[j]];++m2[C[i] + D[j]];}}for (auto a : m1) res += a.second * m2[-a.first];return res;}
};

 

类似题目:

4Sum

 

参考资料:

https://discuss.leetcode.com/topic/67593/clean-java-solution-o-n-2

https://discuss.leetcode.com/topic/67729/concise-8-line-c-solution-with-hashmap-simple-and-clean/2

 

LeetCode All in One 题目讲解汇总(持续更新中...)

转载于:https://www.cnblogs.com/grandyang/p/6073317.html

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

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

相关文章

php的正则表达式函数,php中常用的正则表达式函数

php中常用的正则表达式函数* preg_match()* preg_match_all()* preg_replace()* preg_filter()* preg_grep()* preg_split()* preg_quote()接下来对比讲解&#xff1a;讲解中 $pattern 通常表示正则表达式$subject 通常表示目标处理数据定义一个方法 方便查看数据类型&#xff…

硬件知识:固态硬盘4K对齐知识介绍

目录 1、什么是4K对齐呢&#xff1f; 2、怎么查看硬盘是否4K对齐呢&#xff1f; 3、怎么4K对齐呢&#xff1f; 现在大家基本都有一个固态硬盘&#xff0c;而在固态硬盘分区中4K对齐是非常重要的。 1、什么是4K对齐呢&#xff1f; “4K对齐”就是符合“4K扇区”定义格式化过的硬…

【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别

SpringCloudApplication注解 注解SpringCloudApplication包括&#xff1a;SpringBootApplication、EnableDiscoveryClient、EnableCircuitBreaker&#xff0c;分别是SpringBoot注解、注册服务中心Eureka注解、断路器注解。对于SpringCloud来说&#xff0c;这是每一微服务必须应…

网络知识:路由器常见故障分析及处理方法

目录 1.路由器的部分功能无法实现 2.网络频繁掉线 3.无法浏览网页 4.某些应用无法使用 5&#xff0e;网络带宽达不到合同带宽或相差甚远 6.局域网内存在多个路由器&#xff0c;因人为原因出现二级路由 对当前的大多数网络来说&#xff0c;无论是实现网络互连还是访问Internet&a…

matlab找不到函数系统函数,求助,Matlab找不到ztrans函数

只把这个函数给你吧,你自己保存下:function F ztrans(varargin)%ZTRANS Z-transform.% F ZTRANS(f) is the Z-transform of the scalar sym f with default% independent variable n. The default return is a function of z:% f f(n) > F F(z). The Z-transfor…

硬件技巧:如何隐设置的你的电脑U盘不可见

有时候电脑里面有重要内容&#xff0c;在不联网的情况下&#xff0c;还需要禁用U盘&#xff0c;下面介绍禁用U盘的方法&#xff0c;原创文章&#xff0c;转载注明出处即可。 第一步&#xff0c;首先在电脑上点击开始按钮&#xff0c;或者直接按下快捷键组合"WinR"&am…

XidianOJ 1035 数独 1053 正数负数 1042 另一个简单的游戏

三道水题。。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n; int main(){while (scanf("%d",&n) ! EOF){if (n > 0){printf("yes\n");}else if (n < 0)…

Django 基本命令

1. 新建一个 django projectdjango-admin.py startproject project-name一个 project 为一个项目&#xff0c;project-name 项目名称&#xff0c;改成你自己的&#xff0c;要符合Python 的变量命名规则&#xff08;以下划线或字母开头&#xff09;2. 新建 apppython manage.py …

前端知识:如何创建自己的Iconfont图标库

在日常的开发过程中&#xff0c;前端页面经常会引用一些图标&#xff0c;iconfont图标库是前端开发者非常友好的在线字体图标库。大家可以根据平常所涉及的项目&#xff0c;收藏自己需要的图标库&#xff0c;方便在后续的项目中使用&#xff0c;今天小编给大家介绍如何通过icon…

mysql 二次 聚合,MySql-聚合查询

聚合查询Chloe 可以像写 sql 一样实现聚合查询。IQuery q context.Query();q.Select(a > Sql.Count()).First();/** SELECT COUNT(1) AS C FROM Users AS Users LIMIT 0,1*//* 支持多个聚合函数 */q.Select(a > new{Count Sql.Count(),LongCount Sql.LongCount(),Sum …

硬件:固态硬盘SSD的基础知识及安装注意事项

固态硬盘就是用固态电子存储芯片阵列而制成的硬盘&#xff0c;相对于机械硬盘&#xff0c;固态硬盘的读写速度更快&#xff0c;但是固态硬盘的缺点是寿命不如机械硬盘。 固态硬盘有写入寿命&#xff0c;平均起来约为3000次P/E&#xff0c;1P/E为硬盘存储上限&#xff0c;相当于…

C# Redis实战(二)

二、Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下&#xff0c;其中redis-server.exe即为其服务端程序&#xff0c;双击即开始运行&#xff0c;如图可以将此服务设置为windows系统服务&#xff0c;下载Redis服务安装软件&#xff0c;安装即可。安装完成…

matlab仿真超声波测距,超声波测距仪制作-Arduino中文社区 - Powered by Discuz!

本帖最后由 xiebb5688 于 2017-12-4 09:06 编辑虽然学的是机械&#xff0c;可也接触过C语言&#xff0c;MATLAB等程序&#xff0c;每次编程的时候&#xff0c;能够把BUG一个个解决掉&#xff0c;会带来不小的成就感。于是感觉到自己骨子还是挺喜欢代码的。于是也不知何时了解了…

Mac版本Navicat下载

提供navicat安装包 链接&#xff1a;https://pan.baidu.com/s/1mQddUOuaxovVkhNOT9vUJw 密码&#xff1a;tted

电脑技巧:键盘上的这几个键,不常用,但有必要了解一下

目录 键盘上三个特殊的键 Print Screen&#xff08;或 Prt Scn&#xff09; Scroll Lock&#xff08;或 Scr Lk&#xff09; Pause/Break ​​​​​​​ 键盘上三个特殊的键 通过前几期的文章&#xff0c;我们已经讨论了几乎所有可能要用到的键。但为了真正彻底地了解键盘&…

ip访问php $_files空,PHP中表单没有问题但$_FILES为空怎么办?

PHP中表单没有问题&#xff0c;但“$_FILES”为空的解决方法&#xff1a;首先在form中加代码为“enctype"multipart/form-data”&#xff1b;然后开启“file_uploads”并设置“file_uploadson”即可。PHP中表单没有问题但是$_FILES为空的解决办法在文件上传中$_FILES接收不…

一张图看透微信公众号、企业号、小程序

对于微信小程序&#xff0c;推荐了解关键词&#xff1a;“progress web app” 我觉得微信小程序跟原生app之间也没有什么好争议的&#xff0c;就如微信和手机qq一样&#xff0c;有了微信&#xff0c;手机QQ也没有死掉&#xff0c;微信小程序适合小型应用&#xff0c;或者说能用…

lamba List 转 Map

Java 8 以前的写法&#xff1a; Map<Long, User> userMap new HashMap<Long, User>(); for (User user : users) {userMap.put(user.getId(), user); } Java 8 写法&#xff1a; Map<Long, User> userMap users.stream().collect(Collectors.toMap(User:…