Leetcode 454. 四数相加 II

文章讲述了如何使用哈希表优化解决四数相加II问题,通过构建哈希表存储两数之和及其出现次数,然后遍历其他两个数组寻找和为0的组合,时间复杂度和空间复杂度均为O(N^2)。
摘要由CSDN通过智能技术生成

题源: 454. 四数相加 II
题目的核心是求解四个数组 nums1, nums2, nums3, 和 nums4 中所有元素组合 (a, b, c, d) 的数量,使得它们的和为 0。这道题可以通过哈希表来优化查找和计算过程,减少时间复杂度。

解题思路

  1. 构建哈希表:
    首先,遍历数组 nums1nums2,计算所有可能的两数之和,并将这些和存储在一个哈希表中(以和为键,出现次数为值)。这一步是为了记录每一种可能的两数之和及其出现的次数,为后面的匹配操作提供便利。

  2. 计算匹配和:
    然后,遍历数组 nums3nums4,对于每对 (c, d),计算 -(c + d),查找这个值是否已经作为键存在于哈希表中。如果存在,说明找到了对应的 (a, b) 组合,使得 a + b + c + d = 0。将哈希表中该键的值(即 (a, b) 组合出现的次数)累加到结果 count 中。

  3. 返回结果:
    遍历完成后,count 中存储的就是所有满足 a + b + c + d = 0 的四元组组合的数量。

时间复杂度

  • 构建哈希表的时间复杂度为 O(N^2),其中 N 是单个数组的长度(假设所有数组长度相等)。这是因为需要遍历 nums1nums2 的所有元素组合。
  • 查找和匹配的时间复杂度同样为 O(N^2),因为需要遍历 nums3nums4 的所有元素组合,并进行哈希表查找操作。

因此,整体时间复杂度为 O(N^2)

空间复杂度

  • 哈希表的空间复杂度最坏情况下也为 O(N^2),这取决于 nums1nums2 两数之和的不同结果数量。

Code

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> map;
        for(int a : nums1)
            for(int b : nums2)
                map[a + b] ++;
        
        int count = 0;        //记录a + b + c + d = 0的次数
        for(int c : nums3)
            for(int d : nums4)
                if(map.find(0 - (c + d)) != map.end())
                    count += map[0 - (c + d)];        
                    //map[0 - (c + d)]的值代表所有使得 a + b = -(c + d) 的 (a, b) 对的数量,不能简单写为count ++
        return count;
    }
};
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值