题目

给定四个包含整数的数组列表 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 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。

思考

这一题和LeetCode 18. 四数之和题目相似,但是本质不同。
因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。
而本题是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况。
回顾之前的两数之和,其实这边思路是一致的。
采用分为两组,HashMap存一组,另一组和HashMap进行比对。

这样的话情况就可以分为三种:
1.HashMap存一个数组,如A。然后计算三个数组之和,如BCD。时间复杂度为:O(n)+O(n3),得到O(n3).
2.HashMap存三个数组之和,如ABC。然后计算一个数组,如D。时间复杂度为:O(n3)+O(n),得到O(n3).
3.HashMap存两个数组之和,如AB。然后计算两个数组之和,如CD。时间复杂度为:O(n2)+O(n2),得到O(n^2).
三.根据第二点我们可以得出要存两个数组算两个数组。
四.我们以存AB两数组之和为例。首先求出A和B任意两数之和sumAB,以sumAB为key,sumAB出现的次数为value,存入hashmap中。
然后计算C和D中任意两数之和的相反数sumCD,在hashmap中查找是否存在key为sumCD。
这段理解来自于guo-sheng-fei
觉得说的挺有条理,直接拿过来用了。

代码

class Solution {public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {//前面是nums,后面是出现的频次unordered_map<int,int> map;//总组合数目int count=0;for(int i=0;i<A.size();i++){for(int j=0;j<B.size();j++){map[A[i]+B[j]]++;}}for(int i=0;i<C.size();i++){for(int j=0;j<D.size();j++){int iter=0-(C[i]+D[j]);//如果能找到if(map.find(iter) !=map.end()){count+=map[iter];}}}return count;}
};

LeetCode 454. 四数相加 II 思考分析相关推荐

  1. LeetCode 454. 四数相加 II【哈希表】

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

  2. leetcode 454. 四数相加 II(哈希表)

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...

  3. leetcode 454. 四数相加 II c语言

    如题: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0.为了使问题简单化,所有 ...

  4. LeetCode 454. 四数相加 II(哈希)

    1. 题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化 ...

  5. 给定4个数字组合的C语言算法,leetcode 454. 四数相加 II c语言

    如题: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所 ...

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

    Leetcode 454.四数相加II 思路分析: 本题直观的想法是采取暴力法,四数相加就用四层for循环.虽然能得到结果,但时间复杂度为o(n4),当数组长度较大时,Leetcode便提示超时.该方 ...

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

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

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

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

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

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

最新文章

  1. for 循环里调用ajax,for循环中ajax异步问题如何解决?
  2. 解决Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be exe
  3. Optional变量初学者指南
  4. node中异步IO的理解
  5. 俄语使用计算机怎么说,计算机俄语常用词汇
  6. 拨盘Demo大赛,获奖公布-20170710
  7. 三维数组设置索引_python3三维数据结构 —— panel
  8. android 捕获Home键和ACTION_TIME_TICK广播
  9. 转》谨防APP明文HTTP传输数据泄露隐私
  10. 按比例设置获奖人数方案
  11. 自考那些事儿(九):再次学操作系统
  12. 大数据分析的思路与流程
  13. Java Interview Questions (1)
  14. python 打开pdf显示在页面_C# WinForm打开PDF文件并在窗体中显示
  15. 【二〇二一·立秋】读书笔记
  16. 什么是IaaS PaaS SaaS,看这一篇就够了
  17. 计算机如何回到桌面,电脑系统教程:win10怎么返回到桌面状态
  18. 我用20种编程语言送上新年的祝福,Happy new year!
  19. echart 的各大国家城市坐标
  20. Swift Literal Convertibles

热门文章

  1. vues响应接口and实例
  2. Android studio的sdk tools下没有LLDB的解决办法
  3. 2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程
  4. javaScript学习笔记之break 和 continue 语句对比
  5. 华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验
  6. hutool 自定义excel_Hutool Java 工具类库导出 Excel,超级简单!
  7. 天涯明月刀7月4号服务器维护,7月8日服务器例行维护公告
  8. echarts自定义图例legend文字和样式
  9. HTML5--应用网页模板
  10. webpack联邦模块之remotes方法