🎈个人主页:算法诗人
✨收录专栏:算法诗人Leetcode揭秘之旅
🎉欢迎 👍点赞✍评论⭐收藏
🤝希望我的文章能对你们有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗
Leetcode题目链接
一、题目描述
给定两个数组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),比较损耗资源。
如果我们把数组等分为两组,分别计算和,再利用哈希表去寻找互为相反数的个数,这样就可以大量减少资源的损耗。
具体步骤如下:
-
创建一个空的哈希表 sum_12,用于存储数组 nums1 和 nums2 中元素和的频率。
-
使用两重循环遍历数组 nums1 和 nums2 的所有元素,计算它们的和,并在哈希表 sum_12 中记录和的频率。
-
初始化变量 count 为 0,用于存储满足条件的四元组的数量。
-
使用两重循环遍历数组 nums3 和 nums4 的所有元素,计算它们的和,并计算当前和的相反数 target。
-
在哈希表 sum_12 中查找是否存在相反数 target,如果存在,则将对应的频率加到 count 上。
-
最终返回 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 是数组的长度。
本题难度较小,有问题可以评论或者私信哦,我会尽力解答!
结尾碎碎念
“这次的算法解析只是冰山一角,未来我将持续分享更多有趣的算法问题,并提供更深入的解析。如果你对这个系列感兴趣,不要错过即将到来的更新!点赞、关注、收藏,如果有不同的解法欢迎留下你的评论,你们的支持就是我更新的最大动力。让我们一起探索更多算法的奇妙世界,这不仅是为了迎接面试挑战,更是为了成为在编程领域中游刃有余的专家。感谢大家的支持,期待未来更多的相遇和共同成长!”