题目描述
思路解析动画文字版
记住「按难度排序工作、按能力排序工人;指针不回退地纳入难度够到的工作、维护最大收益 best,每个工人取 best」,下面每帧都在套它。
先排序。工作按难度排好:难度 [2, 4, 6, 8, 10]、对应收益 [10, 20, 30, 40, 50](右边面板就是这张「难度→收益」对照表);工人按能力排好 [4, 5, 6, 7]。排序是双指针不回退的前提。
来了个能力 4 的工人。他能做难度不超过 4 的任意工作,目标是从这些工作里挑收益最高的。指针从上一个工人停下的位置接着往右扫,不回退。
难度 2 不超过 4,这份工作他做得了,纳入候选。它的收益是 10,比之前的 best 高,best 更新成 10。注意 best 只增不减,后面工人能力更强、能用的工作只多不少。
难度 4 不超过 4,这份工作他做得了,纳入候选。它的收益是 20,比之前的 best 高,best 更新成 20。注意 best 只增不减,后面工人能力更强、能用的工作只多不少。
再往右,难度 6 已经大于 4,这个工人做不了,停。指针就停在这里,等下一个能力更强的工人接着往右走。
这个工人就拿他能力内的最高收益 20,加进总收益,现在 ans = 20。他不一定做难度最高那份,而是做收益最高那份,这正是要维护 best 的原因。
来了个能力 5 的工人。他能做难度不超过 5 的任意工作,目标是从这些工作里挑收益最高的。指针从上一个工人停下的位置接着往右扫,不回退。
再往右,难度 6 已经大于 5,这个工人做不了,停。指针就停在这里,等下一个能力更强的工人接着往右走。
这个工人就拿他能力内的最高收益 20,加进总收益,现在 ans = 40。他不一定做难度最高那份,而是做收益最高那份,这正是要维护 best 的原因。
来了个能力 6 的工人。他能做难度不超过 6 的任意工作,目标是从这些工作里挑收益最高的。指针从上一个工人停下的位置接着往右扫,不回退。
难度 6 不超过 6,这份工作他做得了,纳入候选。它的收益是 30,比之前的 best 高,best 更新成 30。注意 best 只增不减,后面工人能力更强、能用的工作只多不少。
再往右,难度 8 已经大于 6,这个工人做不了,停。指针就停在这里,等下一个能力更强的工人接着往右走。
这个工人就拿他能力内的最高收益 30,加进总收益,现在 ans = 70。他不一定做难度最高那份,而是做收益最高那份,这正是要维护 best 的原因。
来了个能力 7 的工人。他能做难度不超过 7 的任意工作,目标是从这些工作里挑收益最高的。指针从上一个工人停下的位置接着往右扫,不回退。
再往右,难度 8 已经大于 7,这个工人做不了,停。指针就停在这里,等下一个能力更强的工人接着往右走。
这个工人就拿他能力内的最高收益 30,加进总收益,现在 ans = 100。他不一定做难度最高那份,而是做收益最高那份,这正是要维护 best 的原因。
边界:够不到任何工作贡献 0、能力够全部则取最高收益、无工作返回 0。
认出「双序列排序 + 双指针贪心」母题,best 单调是线性的关键。
参考代码
from typing import Listclass Solution: def maxProfitAssignment(self, difficulty: List[int], profit: List[int], worker: List[int]) -> int: jobs = sorted(zip(difficulty, profit)) worker.sort() ans = best = i = 0 for w in worker: while i < len(jobs) and jobs[i][0] <= w: best = max(best, jobs[i][1]) i += 1 ans += best return ans复杂度
- 时间:O(n log n + m log m),设工作数 n、工人数 m:排序工作 O(n log n) + 排序工人 O(m log m) 是瓶颈;之后指针 i 不回退、每份工作只扫一次,工人各 O(1) 取 best,这部分 O(n+m) 线性
- 空间:O(n),打包(难度,收益)对需要 O(n);排序栈空间另算
易错点
面试追问把动画讲成自己的话
追问不排序能做吗?
追问和「分发饼干」这类贪心有什么共性?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
排序数组
LeetCode 912 · 中等 · 沿着 排序套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题