[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
[LeetCode] 4Sum II 四数之和之二相关推荐
- leetcode系列--18.四数之和
leetcode系列–18.四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], ...
- leetcode系列--454.四数之和Ⅱ
leetcode 第454题 四数之和Ⅱ 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 &l ...
- 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结
LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...
- 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...
- 代码随想录算法训练营第七天|454.四数相加II 、 383. 赎金信 、15. 三数之和、18. 四数之和
454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, ...
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- 代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和
一.454.四数相加II 力扣 思路:第一眼还没反应过来,真是缺练.在四个数组中分别寻找,可以先把前两个数组的和先存入map中,再计算后两个数组元素的和,看一下相反数在map中出现没有,出现过就res ...
- 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...
最新文章
- python格式批量重命名文件_利用Python批量重命名一系列文件名杂乱的文件
- LeetCode: 107_Binary Tree Level Order Traversal II | 二叉树自底向上的层次遍历 | Easy
- radio button html5,Tkinter Radiobutton单选框的用法
- halcon/c++接口基础 之 HALCON图像变量类
- figma下载_切换到Figma并在其中工作不必是火箭科学,这就是为什么
- Equations HDU - 1496(哈希或三层for循环)求满足公式有多少种情况
- openshift_在OpenShift上扩展Java EE微服务
- java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形
- 产品经理,讲究的是说学逗唱。
- jquery's json url
- C# ITextSharp pdf 自动打印
- 关于php变量的赋值和引用的区别
- mldn andoird
- 使用python进行序列的GC含量的统计
- 共享计算机突然无法访问,共享的文件突然不能访问了电脑重启后又能访问为什么...
- 2021振兴杯参赛后感(部分writeup)
- 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
- CVPR 2021大奖出炉!何恺明获最佳论文提名,华人四篇“最佳”!第一届Thomas S. Huang 纪念奖颁发...
- 3D数据---未来数字世界的物质基础
- 微信小程序开发入门教程(一)