重刷leetcode-day3-[454. 四数相加 II]

108 阅读1分钟

【题目】 454. 四数相加 II

【题目考察】:哈希法、数组

【目标复杂度】: O(n^2)

【解法】:

解法: 我们可以将四个数组分成两部分,A 和 B 为一组,C 和 D 为另外一组。

对于 A 和 B,我们使用二重循环对它们进行遍历,得到所有 A[i]+B[j], 如果在C和D中存在 -(A[i]+B[j]), 那么代表对应的数值相加得到的值是0, 所以我们将-(A[i]+B[j])作为key, -(A[i]+B[j]) 出现的次数作为值存入哈希映射中。

对于 C 和 D,我们同样使用二重循环对它们进行遍历。如果C[k]+D[l] 的值是哈希映射的一个key,那么代表他们相加得到的是0,接着取出次数进行加和。

时间复杂度: O(n^2)

空间复杂度: O(1)

【代码】:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @param {number[]} nums3
 * @param {number[]} nums4
 * @return {number}
 */
var fourSumCount = function(nums1, nums2, nums3, nums4) {
    let hashMap = new Map();
    let count = 0;

    for (let i = 0; i < nums1.length; i++) {
        for (let j = 0; j < nums2.length; j++) {
            const tempSum = -(nums1[i] + nums2[j])
            hashMap.set(tempSum, (hashMap.get(tempSum) || 0) + 1);
        }
    }
    
    for (let i = 0; i < nums3.length; i++) {
        for (let j = 0; j < nums4.length; j++) {
            if (hashMap.has(nums3[i] + nums4[j])) {
                count+= hashMap.get(nums3[i] + nums4[j])
            }
        }
    }
    return count;
};