LC每日一题|20240517 - 826. 安排工作以达到最大收益

54 阅读1分钟

LC每日一题|20240517 - 826. 安排工作以达到最大收益

你有 n 个工作和 m 个工人。给定三个数组: difficultyprofit 和 worker ,其中:

  • difficulty[i] 表示第 i 个工作的难度,profit[i] 表示第 i 个工作的收益。
  • worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。

每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次

  • 举个例子,如果 3 个工人都尝试完成一份报酬为 $1 的同样工作,那么总收益为 $3 。如果一个工人不能完成任何工作,他的收益为 $0

返回 在把工人分配到工作岗位后,我们所能获得的最大利润

提示:

  • n == difficulty.length
  • n == profit.length
  • m == worker.length
  • 1 <= n, m <= 10^4
  • 1 <= 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)