本文已参与「新人创作礼」活动,一起开启掘金创作之路。
454. 四数相加 II
- 题号:力扣454
- 知识点:数组,哈希
- 总结
题干:
思路:
- 1.简单的暴力想法就是四层循环遍历四个数组,计算四数相加为0的次数,但这种想法应该会超时。
- 2.划分为两两相加,nums1和nums2求和得sum1,nums3和nums4求和得sum2,然后再计算
sum1 + sum2 == 0的次数,这样可以将时间复杂度降到 - 3.再改进一下,先对nums1和nums2求和,并将求和的结果存储在一个哈希表中,key值为他们的和,value值为这个和出现的次数。
- 4.然后在对nums3和nums4求和,然后再用
0 -(n3+n4)记为delta,然后再在哈希表中查找delta,delta的value值就是当前这种nums3和nums4的组合下满足nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0的次数。 - 5.两侧循环对nums3和nums4遍历完成后的count就是所有的
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0组合的次数
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> umap;
// 统计nums1和nums2和一种有多少种,以及每种出现的次数
for (int n1 : nums1){
for (int n2 : nums2){
umap[n1+n2] += 1;
}
}
int count = 0;
for (int n3 : nums3){
for (int n4 : nums4){
// (0 - n3 - n4)表示凑成0需要的nums1和nums2组成的和的值
// 查找nums1和nums2组成的和的值是否存在
if (umap.find(0 - n3 - n4) != umap.end()){
// 若存在,它们出现的次数就是和为0的次数
count += umap[0 - n3 - n4];
}
}
}
return count;
}
};