leetcode
leetcode 701 ~ 750
安排工作以达到最大收益

安排工作以达到最大收益

难度:

标签:

题目描述

代码结果

运行时间: 66 ms, 内存: 18.5 MB


/*
 * Problem statement:
 * You have n jobs and m workers. Given three arrays: difficulty, profit, and worker, where:
 * difficulty[i] indicates the difficulty of the ith job, profit[i] indicates the profit of the ith job.
 * worker[i] is the ability of the ith worker, meaning that this worker can only complete a job with difficulty less than or equal to worker[i].
 * Each worker can be assigned at most one job, but one job can be completed multiple times.
 * Return the maximum profit we can achieve after assigning workers to jobs.
 */
import java.util.Arrays;

public class MaxProfitAssignmentStream {
    public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
        // Combine difficulty and profit arrays into a single 2D array
        int[][] jobs = new int[difficulty.length][2];
        for (int i = 0; i < difficulty.length; i++) {
            jobs[i][0] = difficulty[i];
            jobs[i][1] = profit[i];
        }
        // Sort jobs by difficulty and worker by ability
        Arrays.sort(jobs, (a, b) -> a[0] - b[0]);
        Arrays.sort(worker);
        // Use streams to find the maximum profit
        int[] maxProfit = {0};
        int[] best = {0};
        int[] jobIndex = {0};
        Arrays.stream(worker).forEach(w -> {
            while (jobIndex[0] < jobs.length && w >= jobs[jobIndex[0]][0]) {
                best[0] = Math.max(best[0], jobs[jobIndex[0]][1]);
                jobIndex[0]++;
            }
            maxProfit[0] += best[0];
        });
        return maxProfit[0];
    }
}

解释

方法:

题解首先将工作按照利润进行降序排序,如果利润相同则按难度升序排序。随后将工人能力也进行降序排序。使用贪心算法,从能力最强的工人开始,为每个工人分配他能够完成的利润最大的工作。这是通过一个指针i来维持当前能分配的最大利润的工作。如果工人的能力不足以完成当前i指向的工作,则i向后移动,直到找到该工人能完成的工作。这样可以确保每个工人都尽可能地获取最大利润。

时间复杂度:

O(n log n + m log m)

空间复杂度:

O(1)

代码细节讲解

🦆
在算法中,将工作按利润降序排序后,为何还需要在利润相同的情况下按难度升序排序?
在利润相同的情况下,按难度升序排序可以最大化工人的工作机会。这样做确保了在面对相同利润的多个工作时,优先选择难度较低的工作。这样,更多的工人(包括那些能力较低的工人)可以完成这些工作,从而增加整体的利润累积。
🦆
对工人能力进行降序排序的原因是什么?如何确保这种排序方式能帮助实现最大利润?
将工人能力进行降序排序的原因是为了尽可能地让能力最强的工人先选择工作,这样能够最大化利用工人的潜力。这种排序方式确保了能力最强的工人可以首先挑选他们能够完成的最高利润工作,由于他们的能力较高,选择的范围也更广,因此可以最大化每次的利润选择。这种策略帮助实现最大利润,因为它优先考虑了最大化每个工作分配的收益。
🦆
算法中使用了贪心策略,这种策略在所有情况下都能保证找到最大利润吗?存在哪些可能的局限性?
贪心策略在这种特定情况下通常能找到最大利润,因为它总是优先分配可能获得的最大利润。然而,贪心策略的局限性在于它可能不考虑全局最优解,只关注当前的局部最优解。在某些复杂情况下,如果工作与工人的匹配存在多种组合,且这些组合之间相互影响,则单纯的贪心策略可能无法获得全局最优解。
🦆
在题解中提到,如果所有工作都不能由当前工人完成,则停止分配。这种处理方式是否可能导致后续有能力较低的工人错过可完成的工作?
这种处理方式实际上不会导致后续有能力较低的工人错过可完成的工作。因为算法已经将工人按能力进行了降序排序,所以如果一个能力较高的工人都无法完成当前的工作,那么能力更低的工人同样无法完成这些工作。因此,这种处理只是提前终止了无用的迭代,而不会影响结果的正确性。

相关问题