【一天一大 lee】四数相加 II (难度:中等) - Day20201127

2020-12-03 15:41:12 浏览数 (1)

20201127

题目:

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] B[j] C[k] D[l] = 0。

为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在

-2^28

2^28

- 1 之间,最终结果不会超过

2^31

- 1 。

示例:

代码语言:javascript复制
输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

输出:
2

解释:
两个元组如下:
1. (0, 0, 0, 1) -> A[0]   B[0]   C[0]   D[1] = 1   (-2)   (-1)   2 = 0
2. (1, 1, 0, 0) -> A[1]   B[1]   C[0]   D[0] = 2   (-1)   (-1)   0 = 0

抛砖引玉

暴力循环 || 分组循环 -> 超时

代码语言:javascript复制
/**
 * @param {number[]} A
 * @param {number[]} B
 * @param {number[]} C
 * @param {number[]} D
 * @return {number}
 */
var fourSumCount = function(A, B, C, D) {
    let N = A.length,
        _result = 0,
        listA = [],
        listB = []
    // A、B先成组匹配
    for (let a = 0; a < N; a  ) {
        for (let b = 0; b < N; b  ) listA.push(A[a]   B[b])
    }
    // C、D再成组匹配
    for (let c = 0; c < N; c  ) {
        for (let d = 0; d < N; d  ) listB.push(C[c]   D[d])
    }
    // 组合两个组
    for (let c = 0; c < listA.length; c  ) {
        for (let d = 0; d < listB.length; d  ) {
            if (listA[c]   listB[d] === 0) _result  
        }
    }
    return _result
}

上面逻辑超时,那么优化下分组的逻辑,在分组时,组内相同结果会在组合两个组时重复计算,那么使用哈希来去重

抛砖引玉

代码语言:javascript复制
/**
 * @param {number[]} A
 * @param {number[]} B
 * @param {number[]} C
 * @param {number[]} D
 * @return {number}
 */
var fourSumCount = function(A, B, C, D) {
    let N = A.length,
        _result = 0,
        map = new Map()
    for (let a = 0; a < N; a  ) {
        for (let b = 0; b < N; b  ) {
            map.set(A[a]   B[b], (map.get(A[a]   B[b]) || 0)   1)
        }
    }
    for (let c = 0; c < N; c  ) {
        for (let d = 0; d < N; d  ) {
            if (map.has(-C[c] - D[d])) {
                _result  = map.get(-C[c] - D[d])
            }
        }
    }
    return _result
}

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言

公众号:前端小书童

0 人点赞