算法:四数相加||

题目(四数相加 II)

本质是:给你 4 个数组 A、B、C、D统计有多少个四元组 (i, j, k, l)满足A[i] + B[j] + C[k] + D[l] == 0

关键点

数组长度一般 ≤ 200

暴力 4 重循环是 O(n^4)必超时

核心思想:把「四数相加」拆成「两数相加 + 两数相加」

这是这道题的灵魂。

数学变形

A[i] + B[j] + C[k] + D[l] = 0 ↓ (A[i] + B[j]) = -(C[k] + D[l])

也就是说:

只要 某个 (a + b) 等于 **某个 -(c + d)**那么它们就能凑成 0

为什么用 unordered_map?

因为你需要做两件事:

  1. 统计 A + B 的所有可能结果

  2. 快速查找 -(C + D) 是否存在

哈希表刚好满足:

插入:O(1)

查找:O(1)

代码:

cpp 复制代码
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
        // 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中
        for (int a : A) {
            for (int b : B) {
                umap[a + b]++;
            }
        }
        int count = 0; // 统计a+b+c+d = 0 出现的次数
        // 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
        for (int c : C) {
            for (int d : D) {
                if (umap.find(0 - (c + d)) != umap.end()) {
                    count += umap[0 - (c + d)];
                }
            }
        }
        return count;
    }

时间复杂度分析

部分 复杂度
构建 A+B O(n²)
遍历 C+D O(n²)
哈希查找 O(1)
相关推荐
科研前沿3 分钟前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算
Wadli40 分钟前
26.单调栈
算法
晨曦夜月42 分钟前
进程的五大状态及特殊进程解析
linux·服务器·算法
吟安安安安1 小时前
适合短期冲刺的学习工作流(针对算法)
学习·算法
科研前沿1 小时前
什么是时空融合技术?
大数据·人工智能·数码相机·算法·重构·空间计算
AI科技星1 小时前
全域数学本源公理:0、1、∞ 三者核心关系 (典籍定稿版)
人工智能·算法·数学建模·数据挖掘·量子计算
AI科技星1 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
Deepoch1 小时前
数学模型驱动:Deepoc 低幻觉数学大模型助力发动机全周期智能优化
人工智能·算法·机器学习·deepoc·数学大模型·低幻觉
嘻嘻哈哈樱桃1 小时前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
AKDreamer_HeXY1 小时前
QOJ 12255 - 36 Puzzle 题解
数据结构·c++·数学·算法·icpc·qoj