第13天 四数相加II

建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。

题目链接:https://leetcode.cn/problems/4sum-ii/

视频讲解:https://www.bilibili.com/video/BV1Md4y1Q7Yh

一、看到题目的第一想法

这道题要求从四个数组中各选一个数,使它们的和为 0,并统计这样的组合数。

  1. 暴力思路(直接被排除):最朴素的想法是写四层循环,遍历所有可能的组合,但时间复杂度是 \(O(n^4)\),当数组长度较大时,效率极低,完全无法通过。
  2. 优化方向 :既然直接暴力不可行,就要想办法降低复杂度。把四个数分成两组,前两个一组、后两个一组,先算 A[i]+B[j] 的和并统计次数,再算 -(C[k]+D[l]) 去匹配,这样就把 \(O(n^4)\) 拆成了两次 \(O(n^2)\),整体时间复杂度降到 \(O(n^2)\),这是最关键的突破口。
  3. 工具选择 :统计频次自然想到用哈希表(unordered_map),把前两个数组的和作为键,出现次数作为值,后面两个数组的和直接去哈希表里找补数即可。

二、实现过程中遇到的困难

  1. 如何拆分问题的思路误区一开始很容易陷入 "固定三个数,找第四个数" 的三层循环思路,复杂度是 \(O(n^3)\),虽然比暴力好,但在数据量大时还是会超时。理解 "两两分组" 的核心思想,是解决这道题的关键难点。
  2. 哈希表的使用细节
    • 一开始可能会忘记 count() 检查键是否存在,直接访问 countAB[-u-v],如果键不存在,会自动插入一个值为 0 的键,虽然不影响结果,但会增加不必要的内存占用。
    • 理解 countAB[u+v]++ 的作用:它是在统计 A+B 中每个和出现的次数,后续匹配时要把这个次数累加到答案里,而不是只加 1。
  3. 补数关系的理解 要保证 A[i]+B[j]+C[k]+D[l] = 0,等价于 A[i]+B[j] = -(C[k]+D[l])。一开始很容易搞反符号,写成 C[k]+D[l] 去匹配,导致结果错误。
  4. 边界情况处理比如数组长度为 0、元素为负数、多个相同和的情况,需要确保哈希表的计数和累加逻辑能正确处理这些场景。

三、今日收获心得

  1. 分治 / 分组优化的核心思想这道题最核心的技巧是 "分组",把高复杂度的问题拆分成两个低复杂度的子问题。对于 n 数之和问题,当 n 为偶数时,两两分组是通用的优化思路,能把时间复杂度从 \(O(n^k)\) 降到 \(O(n^{k/2})\)。
  2. 哈希表的高效应用哈希表在统计频次、快速查找补数的场景中非常好用。这道题里,哈希表把 "查找补数" 的操作从 \(O(n)\) 降到了 \(O(1)\),是整个算法效率的关键支撑。
  3. 时间与空间的权衡 用哈希表存储 A+B 的和,空间复杂度会变成 \(O(n^2)\),但换来了时间复杂度从 \(O(n^4)\) 到 \(O(n^2)\) 的大幅优化。算法题中,这种 "用空间换时间" 的思路非常常见,要学会根据题目限制灵活选择。
  4. 代码细节的严谨性
    • 用 count() 检查键是否存在,可以避免不必要的插入操作,提升效率。
    • 累加答案时,要把哈希表中对应的次数全部加上,而不是只加 1,这是统计组合数的关键细节。
相关推荐
suhan1 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan1 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan1 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan1 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan1 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB2 小时前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+1113 小时前
算法 --哈希表
数据结构·算法·散列表
灯澜忆梦3 小时前
【面向对象编程c++】| 数组与函数
java·数据结构·c++
codigger4 小时前
哈希算法:一根看不见的 "指纹",如何撑起整个互联网
后端·区块链·哈希算法·sha256
沫璃染墨4 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书