题目描述
思路解析动画文字版
看到某一位等于 target 就直接收下,会被其它位超标污染。
只用每一位都不超过 target 的三元组,再看三个位是否都能被覆盖。
① 合并=逐位取 max;只能用「三位都 ≤ target」的三元组:核心:合并逐位取 max,越合越大,只能用不超标的三元组。
② [2,5,3]:三位都 ≤ target ✓ 可用,第 0 位 2==2 → 凑到位0:可用三元组才看它命中 target 的哪一位。
③ [1,8,4]:第 1 位 8 > 7 超标 → 丢弃:有一位超标,整条作废 —— 这是最关键的判定。
④ [1,7,5]:三位都 ≤ ✓ 可用,7==7、5==5 → 凑到位1、位2:不同位可以来自不同三元组。
⑤ 三位都被「可用三元组」精确命中 → true:每位都有人精确等于 target,合并即得目标。
一句话记住:只用每一位都不超过 target 的三元组,再看三个位是否都能被覆盖。
边界三连:本题真边界:无可用、单条命中、缺一位。
⑥ 雷区:看到某位==target 就收,会被超标位污染:判定看整条、不看单位:一位超标,全条不能用。
面试追问 · 核心思路:思路:过滤可用(全≤target),记录每位是否被精确命中,三位齐→true。
面试追问 · 为何充分:可用三元组合并各位≤target,每位有人==target ⇒ 合并正好=target。
面试追问 · 复杂度:复杂度:一趟扫描 O(n),三个布尔 O(1)。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=greedy 连刷同类题;卡住时用 AI 答疑问“为什么整条超标就不能用”。
参考代码
class Solution: def mergeTriplets(self, triplets, target): good = [False, False, False] for tri in triplets: if all(tri[i] <= target[i] for i in range(3)): for i in range(3): if tri[i] == target[i]: good[i] = True return all(good)复杂度
- 时间复杂度:O(n),扫一遍所有三元组,每条 O(1) 判定
- 空间复杂度:O(1),只用 3 个布尔标记位是否凑到
可套用的代码模板
记牢:整条 ≤ target 才可用 → 标记它命中的位 → 三位齐则 true。
Python
# 合并三元组(逐位取 max)骨架good = [False, False, False]for a, b, c in triplets: if a <= target[0] and b <= target[1] and c <= target[2]: # 整条可用 if a == target[0]: good[0] = True if b == target[1]: good[1] = True if c == target[2]: good[2] = Truereturn all(good) # 三位都被精确命中易错点
面试追问把动画讲成自己的话
追问整体思路是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
划分字母区间
LeetCode 763 · 中等 · 沿着 贪心 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题