题目描述
代码解决
class Solution { public: int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) { // 创建一个哈希表map,用于存储nums1和nums2中的两数之和及其出现的次数 unordered_map<int, int> map; // 遍历nums1和nums2,将它们的所有两数之和存入map,并计数 for (int a : nums1) { for (int b : nums2) { map[a + b]++; } } // 初始化计数器count,用于记录满足条件的四元组数目 int count = 0; // 遍历nums3和nums4,查找其两数之和的相反数是否存在于map中 for (int c : nums3) { for (int d : nums4) { int flag = 0 - (c + d); if (map.find(flag) != map.end()) { // 如果找到,则将该两数之和的出现次数加到count中 count += map[flag]; } } } // 返回满足条件的四元组数目 return count; } };
这段代码实现了一个名为
fourSumCount
的函数,该函数用于计算四个数组中任意两个数组组合可以组成的四数之和的总数。这个函数假设每个数组中的元素都是唯一的。以下是代码的详细解释:
创建一个
unordered_map
map
,用于存储两个数组nums1
和nums2
中任意两个数的和以及它们的数量。遍历数组
nums1
和nums2
,对于每个数a
和b
,计算它们的和a+b
,并将这个和作为键存储在map
中,其对应的值是这个和出现的次数。初始化一个变量
count
,用于存储最终的结果,初始值为0。遍历数组
nums3
和nums4
,对于每个数c
和d
,计算它们的和c+d
,然后取相反数得到-c-d
,这就是nums1
和nums2
中任意两个数和c+d
相加得到的结果。在
map
中查找-c-d
是否存在。如果存在,说明nums1
和nums2
中存在两个数,它们与nums3
和nums4
中的两个数相加可以得到c+d
,因此count
应该增加map
中-c-d
对应的值。重复步骤4和5,直到遍历完所有可能的组合。
返回
count
,这就是nums1
和nums2
中任意两个数与nums3
和nums4
中任意两个数相加可以得到的四数之和的总数。这个函数的时间复杂度是O(n^2),其中n是
nums1
和nums2
中元素的数量。空间复杂度也是O(n^2),因为最坏情况下map
中可能存储所有可能的和。