-
发表于 2024.05.12
-
朴素做法是,对于每一个
worker
,遍历所有的工作,找到难度满足工人能力中收益的最大值,这样的复杂度为O(nm)
。可以通过排序的方法降到O(nlogn + mlogm)
:对工作按工作难度进行排序,以及对工人的能力进行排序,使用一个指针cur_valid_work_cnt
维护当前有效的工作数量(即对于当前遍历的工人都能干的活),并使用cur_valid_work_max_profit
维护当前有效工作最大收益,然后对于每一个worker
,首先更新下有效工作信息(cur_valid_work_cnt
指针往右移动直到下一个工作不满足工人难度,并最大收益),并累加有效工作的最大收益即可。class Solution: def maxProfitAssignment(self, difficulty: List[int], profit: List[int], worker: List[int]) -> int: works = sorted(zip(difficulty, profit)) worker.sort() ans = 0 cur_valid_work_cnt = 0 cur_valid_work_max_profit = 0 for i, cap in enumerate(worker): while cur_valid_work_cnt < len(works) and works[cur_valid_work_cnt][0] <= cap: cur_valid_work_max_profit = max(cur_valid_work_max_profit, works[cur_valid_work_cnt][1]) cur_valid_work_cnt += 1 ans += cur_valid_work_max_profit return ans
- LC 题目链接
-