题目
给你四个整数数组 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
-2^28 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 2^28
思路
这题我们要求的是满足四数之和等于0的下表元组个数,由于数组相互分立,我们不需要考虑去重的影响,所以我们可以运用a+b+c+d=0可以转化为a+b=-(c+d),先存a+b的和,然后遍历-(c+d),如果发现map中存在该key,我们就给计数器加上对应的数量也就是value,下面根据笔者的代码进行进一步的了解。
代码实现
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int>mp;//设置map哈希表
int count=0;//计数器
for(int a:nums1){
for(int b:nums2){
mp[a+b]++;//将nums1 nums2中的元素加和存起来
}
}
for(int c:nums3){
for(int d:nums4){
//由于a+b+c+d=0可以转化为a+b=-(c+d)
if(mp.find(-(c+d))!=mp.end())//如果发现map中存在-(c+d),那么将对应的数量加起来
count++;
}
}
//并且这道题只要求下表,所以不用去重,直接加和即可
return count;
}
};
反思
本题采用unordered_map该哈希表,运用该哈希表,我们实现了两两分组加和的计数和查找,通过等价转换我们可以简化很多问题,如果采用暴力循环的话,会导致时间复杂度太高,运用该种方式,有效的降低了时间复杂度。
尾声
本篇文章是哈希算法的续篇,通过本道题目,笔者希望和读者共同学会哈希表的运用和加深对哈希表的认识和理解,为我们后面的三数之和,四数之和打下了基础。如果觉得笔者写的还不错的话,记得留下你的点赞关注和收藏哦~