题目
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
解题思路
首先这是个典型的找元素的题目,想到的是哈希法,因为要存相加值和出现的次数,就应该想到要用到map映射,而不需要排序,就应该使用效率相对较高的unordered_map。
我们首先遍历nums1和nums2,将每俩元素的和作为key存入map,将出现的次数作为value存入。
再遍历nums3和nums4,算每俩元素的和并在map中找是否有key与其和为0,有则count加上出现次数value
下面是代码
//使用unordered_map的哈希法
#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4)
{
unordered_map<int, int> map;
int count = 0;
for (int a : nums1)
{
for (int b : nums2)
{
map[a + b]++;
}
}
for (int c : nums3)
{
for (int d : nums4)
{
if (map.find(0 - (c + d)) != map.end())
{
count += map[0 - (c + d)];
}
}
}
return count;
}
};