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 四数之和之二相关推荐

  1. leetcode系列--18.四数之和

    leetcode系列–18.四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], ...

  2. leetcode系列--454.四数之和Ⅱ

    leetcode 第454题 四数之和Ⅱ 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 &l ...

  3. 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结

    LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...

  4. 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和

    一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...

  5. 代码随想录算法训练营第七天|454.四数相加II 、 383. 赎金信 、15. 三数之和、18. 四数之和

    454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, ...

  6. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  7. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  8. 代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和

    一.454.四数相加II 力扣 思路:第一眼还没反应过来,真是缺练.在四个数组中分别寻找,可以先把前两个数组的和先存入map中,再计算后两个数组元素的和,看一下相反数在map中出现没有,出现过就res ...

  9. 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...

最新文章

  1. python格式批量重命名文件_利用Python批量重命名一系列文件名杂乱的文件
  2. LeetCode: 107_Binary Tree Level Order Traversal II | 二叉树自底向上的层次遍历 | Easy
  3. radio button html5,Tkinter Radiobutton单选框的用法
  4. halcon/c++接口基础 之 HALCON图像变量类
  5. figma下载_切换到Figma并在其中工作不必是火箭科学,这就是为什么
  6. Equations HDU - 1496(哈希或三层for循环)求满足公式有多少种情况
  7. openshift_在OpenShift上扩展Java EE微服务
  8. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形
  9. 产品经理,讲究的是说学逗唱。
  10. jquery's json url
  11. C# ITextSharp pdf 自动打印
  12. 关于php变量的赋值和引用的区别
  13. mldn andoird
  14. 使用python进行序列的GC含量的统计
  15. 共享计算机突然无法访问,共享的文件突然不能访问了电脑重启后又能访问为什么...
  16. 2021振兴杯参赛后感(部分writeup)
  17. 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页
  18. CVPR 2021大奖出炉!何恺明获最佳论文提名,华人四篇“最佳”!第一届Thomas S. Huang 纪念奖颁发...
  19. 3D数据---未来数字世界的物质基础
  20. 微信小程序开发入门教程(一)

热门文章

  1. quick cocos2d-x 精灵大小(宽高)获取
  2. Codeforces 258B Little Elephant and Elections
  3. Spring--Context
  4. DOM-13 【实战】输入及状态改变事件、京东搜索框
  5. iOS 快速实现分页界面的搭建
  6. 猜1-10的数字python脚本
  7. JS中popup.js
  8. Android 开源框架Universal-Image-Loader学习
  9. PostgreSQL入门篇学习笔记(七)
  10. 邻接矩阵实现图的深度优先搜索(1)