栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

每天一算:4Sum II

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

每天一算:4Sum II

leetcode上第454号问题:4Sum II

题目

给定四个包含整数的数组列表 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 。

例如:

输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

输出:
2

解释:
两个元组如下:

  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

解题思路

与Two Sum类似,需要用哈希表来解决问题。

  • 把A和B的两两之和都求出来,在哈希表中建立两数之和与其出现次数之间的映射
  • 遍历C和D中任意两个数之和,只要看哈希表存不存在这两数之和的相反数就行了

##动画演示

参考代码
// 454. 4Sum II
// https://leetcode.com/problems/4sum-ii/description/
// 时间复杂度: O(n^2)
// 空间复杂度: O(n^2)
class Solution {
public:
    int fourSumCount(vector& A, vector& B, vector& C, vector& D) {

 unordered_map hashtable;
 for(int i = 0 ; i < A.size() ; i ++){
     for(int j = 0 ; j < B.size() ; j ++){
   hashtable[A[i]+B[j]] += 1;
     }
 }
 
 int res = 0;
 for(int i = 0 ; i < C.size() ; i ++){
     for(int j = 0 ; j < D.size() ; j ++){
  if(hashtable.find(-C[i]-D[j]) != hashtable.end()){
      res += hashtable[-C[i]-D[j]];
  }
     }
 }
    
 return res;
    }
};

执行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232451.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号