四数相加
题目
给你四个整数数组 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
解释:
两个元组如下:
- (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
- (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
思路
将前面的两个数组所有和的情况分别列出来,出现几次那么这个和(作为key)对应的value++,那么得到的是一个以所有和情况为key,value为次数的unordered_map,这里名称为compare
然后,再根据后面两个数的和进行处理
代码
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int>compare;
for(int a:nums1){
for(int b:nums2){
compare[a+b]++;//这个是一个很重要的点,也就是map可以直接根据[]进行key和value的匹配
}
}
// for(unordered_map<int,int>::iterator it = compare.begin();it!=compare.end();it++){
// cout<<(*it).first<<" "<<(*it).second<<endl;
// }
int count=0;
for(int c:nums3){
for(int d:nums4){
if(compare.find(0-c-d)!=compare.end()){
//还有注意这里的这个元素compare[0-c-d]不用删除,因为是排列组合的问题,不用删除
//count++;注意这里的
count+=compare[0-d-c];
}
}
}
return count;
}
};

浙公网安备 33010602011771号