题目描述
思路解析动画文字版
记住「前两组的和入哈希,后两组查相反数」,下面每帧都在套它。
左边四格:前两格是 nums1=[1,2],后两格是 nums2=[−2,−1]。先把它们两两相加,结果存进右边哈希表。
取 nums1 的 1(紫 i)和 nums2 的 -2(标 l),两数和 = -1。下一步把它记进哈希表。
把和 -1 记进哈希表(高亮行),它现在出现了 1 次。继续下一对。
取 nums1 的 1(紫 i)和 nums2 的 -1(标 l),两数和 = 0。下一步把它记进哈希表。
把和 0 记进哈希表(高亮行),它现在出现了 1 次。继续下一对。
取 nums1 的 2(紫 i)和 nums2 的 -2(标 l),两数和 = 0。下一步把它记进哈希表。
把和 0 记进哈希表(高亮行),它现在出现了 2 次。继续下一对。
取 nums1 的 2(紫 i)和 nums2 的 -1(标 l),两数和 = 1。下一步把它记进哈希表。
把和 1 记进哈希表(高亮行),它现在出现了 1 次。继续下一对。
前两组枚举完,哈希表记下了所有 a+b 的和及次数:-1 出现 1 次,0 出现 2 次,1 出现 1 次。接下来查后两组。
左边四格换成:前两格 nums3=[−1,2],后两格 nums4=[0,2]。哈希表不变(前两组的成果)。现在每对 (c,d) 去查相反数 −(c+d)。
取 nums3 的 -1 和 nums4 的 0,和 = -1。要凑成 0,就得在哈希表里找 a+b = 1。
哈希表里 1 出现了 1 次(高亮命中),说明有 1 组前两数能和它们配成 0,ans 加到 1。
取 nums3 的 -1 和 nums4 的 2,和 = 1。要凑成 0,就得在哈希表里找 a+b = -1。
哈希表里 -1 出现了 1 次(高亮命中),说明有 1 组前两数能和它们配成 0,ans 加到 2。
取 nums3 的 2 和 nums4 的 0,和 = 2。要凑成 0,就得在哈希表里找 a+b = -2。
哈希表里找不到 -2,这对配不出 0,ans 保持 2。
取 nums3 的 2 和 nums4 的 2,和 = 4。要凑成 0,就得在哈希表里找 a+b = -4。
哈希表里找不到 -4,这对配不出 0,ans 保持 2。
后两组枚举完,累计 ans = 2,就是四数和为 0 的下标四元组个数。靠哈希表把 O(n⁴) 砍成了 O(n²)。
边界先想清:全 0 时组合数是各数组选法的乘积。
面试重点:解释「均衡二分」为何最优 + 与 two-sum 的同构。
参考代码
from typing import Listfrom collections import Counterclass Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: count = Counter(a + b for a in nums1 for b in nums2) return sum(count[-c - d] for c in nums3 for d in nums4)复杂度
- 时间:O(n²),两段各一个双重循环
- 空间:O(n²),哈希表最多存 n² 个不同的和
易错点
面试追问把动画讲成自己的话
追问为什么是「两两分组」而不是「三一分组」?
追问和「两数之和 LC1」有什么关系?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
自定义字符串排序
LeetCode 791 · 中等 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题