思路
- 根据题目这里是四个数组abcd的数相加,将数组两两分组,A大组为ab,B大组为cd
- 由a+b+c+d=0可得A+B=0,即B=0-A
- 遍历数组分别计算出AB大组所有sum值,先将A组sum值存进map里,再从map里面寻找有count个合适的B值(0-A),就可以得到元组数count。
步骤
创建一个 Map:
- 初始化一个空的 Map 对象
twoSumMap
。构建两数之和的映射:
- 遍历数组
nums1
和nums2
。- 对于每一对元素
(n1, n2)
,计算它们的和sum
。- 在
twoSumMap
中更新这个和sum
的计数。计算四数之和为0的组合数:
- 遍历数组
nums3
和nums4
。- 对于每一对元素
(n3, n4)
,计算它们的和sum
。- 检查
twoSumMap
中是否存在0 - sum
的键,如果存在,则累加它的值到count
。返回结果:
- 返回
count
,即所有四数之和为0的组合数。
题目
示例代码
var fourSumCount = function(nums1, nums2, nums3, nums4) {
// 创建一个 Map 对象来存储 nums1 和 nums2 中所有可能的和及其出现的次数
const twoSumMap = new Map();
// 初始化计数器,用于记录满足条件的四元组数量
let count = 0;
// 遍历 nums1 数组
for (const n1 of nums1) {
// 遍历 nums2 数组
for (const n2 of nums2) {
// 计算 nums1 和 nums2 当前元素的和
const sum = n1 + n2;
// 更新 twoSumMap,如果 sum 已存在,则增加其计数,否则设置为1
twoSumMap.set(sum, (twoSumMap.get(sum) || 0) + 1);
}
}
// 遍历 nums3 数组
for (const n3 of nums3) {
// 遍历 nums4 数组
for (const n4 of nums4) {
// 计算 nums3 和 nums4 当前元素的和
const sum = n3 + n4;
// 如果在 twoSumMap 中存在与当前和互为相反数的键,则将其计数加到 count 上
// 0 - sum 表示我们寻找与 (n3 + n4) 和互为相反数的和
count += (twoSumMap.get(0 - sum) || 0);
}
}
// 返回满足条件的四元组数量
return count;
};
欢迎指正!