最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【一天一大 lee】四数相加 II (难度:中等) - Day20211127

    正文概述 掘金(前端小书童)   2020-11-27   551

    题目:

    给定四个包含整数的数组列表  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 。所有整数的范围在 到 - 1 之间,最终结果不会超过   - 1 。

    示例:

    输入:
    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

    抛砖引玉

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

    /**
     * @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
    }

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

    【一天一大 lee】四数相加 II (难度:中等) - Day20211127
    抛砖引玉
    /**
     * @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 栏目 欢迎关注留言

    公众号:前端小书童


    起源地下载网 » 【一天一大 lee】四数相加 II (难度:中等) - Day20211127

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元