首页 > 其他分享 >5.四数相加 II

5.四数相加 II

时间:2024-09-11 17:55:59浏览次数:3  
标签:count map 四数 umap int 相加 II 次数 数组

. - 力扣(LeetCode)

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

思路

这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!

如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案中不可以包含重复的四元组,大家可以思考一下,后续的文章我也会讲到的。

本题解题步骤:

  1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了

C++代码:

class Solution {
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
        // 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中
        for (int a : A) {
            for (int b : B) {
                umap[a + b]++;
            }
        }
        int count = 0; // 统计a+b+c+d = 0 出现的次数
        // 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
        for (int c : C) {
            for (int d : D) {
                if (umap.find(0 - (c + d)) != umap.end()) {
                    count += umap[0 - (c + d)];
                }
            }
        }
        return count;
    }
};

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2

标签:count,map,四数,umap,int,相加,II,次数,数组
From: https://blog.csdn.net/2301_81409946/article/details/142146651

相关文章

  • IIC通信中设备的交互流程
    本文主要叙述,当两个设备进行IIC通信时,两个设备的交互流程,即主机的动作和从机的动作。当通过软件编程的方式实现设备间的IIC通信时,我们就是按照主机的动作或从机的动作来编写对应的代码。实际上,主机和从机是按照IIC通信协议的要求完成相应的动作的( IIC通信协议在文章IIC......
  • C++ 不要将有符号整数和无符号整数相加
    一有符号整数和无符号整数相加时,把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。unsignedintn=300;intm=-500;cout<<m+m<<'\n';cout<<n+m<<'\n';输出:-1000//正确4294967096//错误结果做个类型......
  • 122. 买卖股票的最佳时机 II
    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。 示例1:输入:prices=[7,1,5,3,6,4]输......
  • 黑暗之魂 I&#038;II 合集,豪华中文,重制最终版-灭绝深渊-原罪学者+全DLC+修改器,解压即
    游戏截图《黑暗之魂I&II合集》是一款由FromSoftware开发的经典动作角色扮演游戏合集,囊括了《黑暗之魂》系列的前两部作品:《黑暗之魂:重制版》和《黑暗之魂II:原罪学者》。该合集为玩家提供了进入深邃而神秘的黑暗奇幻世界的机会,体验系列标志性的高难度战斗和复杂的叙事设......
  • ①MODBUS TCP 通信单元(MODBUS TCP 转 RS485)Modbus TCP转Modbus RTU/ASCII网关同步采集
    ModbusTCP转ModbusRTU/ASCII网关同步采集无需编程高速轻松组网MS-A1-50X1系列作为MODBUSTCP通信的服务器进行动作。可通过MODBUSTCP通信,将MS-A1-50X1系列产品通过RS485采集的仪器仪表之类的值作为通信数据输出到PLC,上位机等。系统配置概述使用MS-A1-50X1系......
  • RAII思想
    c++RAII思想什么是RAII资源获取即初始化(ResourceAcquisitionIsInitialization,简称RAII)是一种C++编程技术,它将在使用前获取(分配的堆内存、执行线程、打开的套接字、打开的文件、锁定的互斥量、磁盘空间、数据库连接等有限资源)的资源的生命周期与某个对象的生命周期绑定在......
  • SciTech-Mathmatics-Probability+Statistics-Sampling : Learn Stats for Python III:
    LearnStatsforPythonIII:ProbabilityandSamplingBYIVÁNPALOMARESCARRASCOSAPOSTEDONSEPTEMBER9,2024ProbabilityandSamplingAboutPartIII:ProbabilityandSamplingPartIIIdivesintoappliedprobabilitytheory,concretelybymodelingdiscrete......
  • 代码随想录训练营day41|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机这题和贪心中的买股票很想,但这里不用考虑局部问题,因为只用买一张卖一张。我想可以用一个数组dp来记录买入价格和卖出价格。然后遍历数组草我感觉我写的想贪心。动态规划dp[i][0]表示第i天不持股的最大收益,dp[i][1]表示第i天持股的最大收益。dp......
  • IIC工作模式时序分析
    IIC工作模式时序分析此处利用IO口模拟IIC通信过程中的时序。通信过程在IIC通信过程SDA存在两种模式(接收模式和发送模式),发送或接受一个字节(器件的7个bit+1个bit方向(1-读方向,0-写方向))模式配置当SDA为接入模式接收了1字节数据后在第九个时钟脉冲期间就要变成输出模式发送as......
  • leetcode day06 动态规划之解码方法I和II
    91.解码方法该题类似于爬楼梯方法一:动态规划对于给定的字符串s,设它的长度为n,其中的字符从左到右依次为s[1],s[2],⋯,s[n]。我们可以使用动态规划的方法计算出字符串s的解码方法数。具体地,设f i 表示字符串s的前i个字符s[1..i]的解码方法数。在进行状态转移......