【Leetcode哈希表 454. 四数相加 II】C++

🎈个人主页:算法诗人
✨收录专栏:算法诗人Leetcode揭秘之旅
🎉欢迎 👍点赞✍评论⭐收藏
🤝希望我的文章能对你们有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗



Leetcode题目链接

454. 四数相加 II


一、题目描述

给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一 的。我们可以不考虑输出结果的顺序 。

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000

二、解题思路

最简单暴力的方法是直接遍历四个数组计算和为0的组合,这样的时间和空间复杂度都是O(n^4),比较损耗资源。

如果我们把数组等分为两组,分别计算和,再利用哈希表去寻找互为相反数的个数,这样就可以大量减少资源的损耗。

具体步骤如下:

  1. 创建一个空的哈希表 sum_12,用于存储数组 nums1 和 nums2 中元素和的频率。

  2. 使用两重循环遍历数组 nums1 和 nums2 的所有元素,计算它们的和,并在哈希表 sum_12 中记录和的频率。

  3. 初始化变量 count 为 0,用于存储满足条件的四元组的数量。

  4. 使用两重循环遍历数组 nums3 和 nums4 的所有元素,计算它们的和,并计算当前和的相反数 target。

  5. 在哈希表 sum_12 中查找是否存在相反数 target,如果存在,则将对应的频率加到 count 上。

  6. 最终返回 count,即满足条件的四元组的数量。

这样,通过哈希表的统计和查找,避免了使用暴力法的四重循环,提高了算法的效率。这种方法的时间复杂度为 O(n^2),其中 N 是数组的长度。

三、示例代码

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> sum_12;//定义一个空的map,key存放nums1[i]+nums2[j]的和,value存放每个和出现的次数
        for(int i : nums1)
        {
            for(int j : nums2)
            {
                sum_12[i+j]++;
            }
        }
        int count = 0;
        for(int i : nums3)
        {
            for(int j : nums4)
            {
                int target = -1 * (i + j);//计算当前nums3[i]+nums4[j]的相反数
                if(sum_12.find(target) != sum_12.end())
                {
                    count += sum_12[target];//在sum_12中查找当前相反数的个数,加在count上
                }
            }
        }
        return count;
    }
};

时间复杂度: O(n^2)
空间复杂度: O(n^2),其中 N 是数组的长度。

本题难度较小,有问题可以评论或者私信哦,我会尽力解答!

结尾碎碎念
“这次的算法解析只是冰山一角,未来我将持续分享更多有趣的算法问题,并提供更深入的解析。如果你对这个系列感兴趣,不要错过即将到来的更新!点赞、关注、收藏,如果有不同的解法欢迎留下你的评论,你们的支持就是我更新的最大动力。让我们一起探索更多算法的奇妙世界,这不仅是为了迎接面试挑战,更是为了成为在编程领域中游刃有余的专家。感谢大家的支持,期待未来更多的相遇和共同成长!”

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值