题目描述
思路解析动画文字版
记住「算搭档 y=k−x → 表里有 y 就配掉、没有就存 x」,下面每帧都在套它。
开局这排是原数组,右边「待配数量」表还空着。指针从左到右走,每个数要么和表里的搭档当场配掉,要么先存进表里等人来配。
扫到下标 0 的 1。要凑成和 5,它的搭档得是 5 − 1 = 4。下一步去表里看 4 还有没有存货。
表里没有 4,1 暂时配不上,就把它自己存进表里 count[1] = 1,留着等后面出现 4 时来配它。
扫到下标 1 的 3。要凑成和 5,它的搭档得是 5 − 3 = 2。下一步去表里看 2 还有没有存货。
表里没有 2,3 暂时配不上,就把它自己存进表里 count[3] = 1,留着等后面出现 2 时来配它。
扫到下标 2 的 2。要凑成和 5,它的搭档得是 5 − 2 = 3。下一步去表里看 3 还有没有存货。
表里有 3(下标 1 那个)!当场和 2 配成一对,和正好 3 + 2 = 5,把这个 3 从表里消耗掉,答案加到 1。
扫到下标 3 的 3。要凑成和 5,它的搭档得是 5 − 3 = 2。下一步去表里看 2 还有没有存货。
表里没有 2,3 暂时配不上,就把它自己存进表里 count[3] = 1,留着等后面出现 2 时来配它。
扫到下标 4 的 4。要凑成和 5,它的搭档得是 5 − 4 = 1。下一步去表里看 1 还有没有存货。
表里有 1(下标 0 那个)!当场和 4 配成一对,和正好 1 + 4 = 5,把这个 1 从表里消耗掉,答案加到 2。
扫到下标 5 的 2。要凑成和 5,它的搭档得是 5 − 2 = 3。下一步去表里看 3 还有没有存货。
表里有 3(下标 3 那个)!当场和 2 配成一对,和正好 3 + 2 = 5,把这个 3 从表里消耗掉,答案加到 3。
扫到下标 6 的 4。要凑成和 5,它的搭档得是 5 − 4 = 1。下一步去表里看 1 还有没有存货。
表里没有 1,4 暂时配不上,就把它自己存进表里 count[4] = 1,留着等后面出现 1 时来配它。
扫到下标 7 的 5。要凑成和 5,它的搭档得是 5 − 5 = 0。下一步去表里看 0 还有没有存货。
表里没有 0,5 暂时配不上,就把它自己存进表里 count[5] = 1,留着等后面出现 0 时来配它。
扫到下标 8 的 1。要凑成和 5,它的搭档得是 5 − 1 = 4。下一步去表里看 4 还有没有存货。
表里有 4(下标 6 那个)!当场和 1 配成一对,和正好 4 + 1 = 5,把这个 4 从表里消耗掉,答案加到 4。
扫到下标 9 的 4。要凑成和 5,它的搭档得是 5 − 4 = 1。下一步去表里看 1 还有没有存货。
表里没有 1,4 暂时配不上,就把它自己存进表里 count[4] = 1,留着等后面出现 1 时来配它。
一趟扫完,绿色这些是配成功的,一共 4 对,就是最多操作次数,和开头说的一致。表里剩的那几个值没找到搭档、留在原地。靠「边扫边即时配对」,一遍线性就解决,没有两两暴力。
边界都绕着「能不能找到搭档」和「相等值靠计数配对」。
两个高频追问:与两数之和的关系、排序双指针的对照解法。
参考代码
from typing import Listfrom collections import Counterclass Solution: def maxOperations(self, nums: List[int], k: int) -> int: count = Counter() ans = 0 for x in nums: y = k - x if count[y] > 0: count[y] -= 1 ans += 1 else: count[x] += 1 return ans复杂度
- 时间:O(n),只扫一遍数组,每个数查表、改表都是 O(1)
- 空间:O(n),计数表最多存 n 个还没配上的值
易错点
面试追问把动画讲成自己的话
追问这道题和「两数之和」有什么关系?
追问还有别的解法吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题