LC每日一题|20240517 - 826. 安排工作以达到最大收益
你有
n个工作和m个工人。给定三个数组:difficulty,profit和worker,其中:
difficulty[i]表示第i个工作的难度,profit[i]表示第i个工作的收益。worker[i]是第i个工人的能力,即该工人只能完成难度小于等于worker[i]的工作。每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次 。
- 举个例子,如果 3 个工人都尝试完成一份报酬为
$1的同样工作,那么总收益为$3。如果一个工人不能完成任何工作,他的收益为$0。返回 在把工人分配到工作岗位后,我们所能获得的最大利润 。
提示:
n == difficulty.lengthn == profit.lengthm == worker.length1 <= n, m <= 10^41 <= difficulty[i], profit[i], worker[i] <= 10^5
题目等级:Medium
解题思路
Hash + dp
逻辑非常简单~先遍历difficulty和profit统计每个difficulty值所对应的最高的profit,然后开一个数组记录定义域内所有的difficulty值所能获取到的最大的profit即可。
空间其实可以用二分再优化,但是众所周知,我不会写二分...
AC代码
class Solution {
fun maxProfitAssignment(difficulty: IntArray, profit: IntArray, worker: IntArray): Int {
val map = HashMap<Int, Int>()
for (i in difficulty.indices) {
map[difficulty[i]] = Math.max(map[difficulty[i]] ?: 0, profit[i])
}
val arr = IntArray(100001)
for (i in 1 until arr.size) {
arr[i] = arr[i - 1]
if (map[i] != null) arr[i] = Math.max(arr[i], map[i]!!)
}
var res = 0
worker.forEach { res += arr[it] }
return res
}
}
时间复杂度:O(m + n)
空间复杂度:O(n)