每日一题(LeetCode)----哈希表–四数相加 II
1.题目(454. 四数相加 II)
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1
提示:
n == nums1.length
n == nums2.length
n == nums3.length
n == nums4.length
1 <= n <= 200
-228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228
2.解题思路
思路一:分组+哈希法
1.一共有四组整数数组,我们每两个为一组(这里我们以前两组整数数组为一组,后两组整数数组为一组)
2.创建两个哈希表(这里用unordered_map),两个哈希表的键值都是其组内第一个整数数组中的元素和第二个整数数组中的元素相加所得的数,实值是当前键值的数出现的次数
3.进行遍历,每组中的第一个整数数组的每个数都和第二个整数数组相加一遍,得到的数存入对应的哈希表中
4.定义一个结果变量,遍历其中一个哈希表,每遍历到哈希表中一个元素,我们取出这个哈希表中的实值,然后以0减去当前哈希表中的键值所得到的数作为另一个哈希表中的键值,取出另一个的实值,取出的这两个实值进行相乘然后加到我们的结果变量上即可
3.写出代码
思路一的代码
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int length=nums1.size();
unordered_map<int,int> ma1;
unordered_map<int,int> ma2;
for(int i=0;i<length;i++){
for(int j=0;j<length;j++){
if(ma1.count(nums1[i]+nums2[j])==0){
ma1[nums1[i]+nums2[j]]=1;
}
else{
ma1[nums1[i]+nums2[j]]++;
}
if(ma2.count(nums3[i]+nums4[j])==0){
ma2[nums3[i]+nums4[j]]=1;
}
else{
ma2[nums3[i]+nums4[j]]++;
}
}
}
int res=0;
for(auto v:ma1){
if(ma2.count(0-v.first)!=0){
res+=v.second*ma2[0-v.first];
}
}
return res;
}
};