题目(leecode T454):
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
方法:这道题目感觉和昨天的两数之和有一点相似度,可以借鉴一下昨天题目的思想。只不过数组个数由两个变成了四个,target是固定值0而已。四个数组我们可以变成两个呀,具体怎么变呢?就是把nums1和nums2数组通过两层for循环遍历的方式视作一个整体处理。nums3和nums4通过两层for循环遍历视作一个整体处理,搜索他们的和有没有为0的组合,有的话有几个呢。
我们首先定义一个unordered_map,遍历nums1和nums2数组,将他们每个元素的和作为key放到map中,并把每个和出现的次数作为value保存到map中。再遍历nums3和nums4数组,如果有元素和map中的key的值的和为0,则找到了符合条件的情况,就把count加上相应key的value,即符合条件的元素组合的个数,把所有的nums3和nums4都遍历一遍之后的count值就是最终的结果,
题解:
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> umap;
for(int a : nums1){
for(int b : nums2){
umap[a + b]++; //遍历nums1和nums2,将所有的和都保存下来
}
}
int count = 0;
for(int c : nums3){
for(int d : nums4){
if(umap.find(0 - (c + d)) != umap.end()){ //找到满足条件的情况
count += umap[0 -(c + d)]; //count加上相应和出现的次数
}
}
}
return count;
}
};