LeetCode#826 安排工作以达到最大收益 (Java+Python解题)

问题描述:

有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益。

现在我们有一些工人。worker[i]是第i个工人的能力,即该工人只能完成难度小于等于worker[i]的工作。

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

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

我们能得到的最大收益是多少?

示例:

输入: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
输出: 100 
解释: 工人被分配的工作难度是 [4,4,6,6] ,分别获得 [20,20,30,30] 的收益。

提示:

    1 <= difficulty.length = profit.length <= 10000
    1 <= worker.length <= 10000
    difficulty[i], profit[i], worker[i]  的范围是 [1, 10^5]

思路1:

      先按照降序排列的顺序,记录收益(也是对应工作难度的原本索引值),再将收益降序排列。

扫描二维码关注公众号,回复: 12684043 查看本文章

      然后将工人的能力升序排列,那么后面的工人一定能取到比前一个工人更高的利润,使用best存储这个过程量。对每一个工人循环操作,加上这个工人能拿到的最大利润值,即是总共能得到的最大收益。

Python版本:

      这一版,超时了。主要时间还是在排序上。

import numpy as np
class Solution(object):
    def maxProfitAssignment(self, difficulty, profit, worker):
        """
        :type difficulty: List[int]
        :type profit: List[int]
        :type worker: List[int]
        :rtype: int
        """
        profit1 = np.array(profit)
        index = np.argsort(-profit1)
        profit.sort(reverse = True)
        len1 = len(difficulty)
        res = 0
        best = 0
        for w in sorted(worker):
            for j in range(0,len1,1):
                if w>=difficulty[index[j]]:
                    best = max(profit[j], best)
            res+=best
        return res

Java版本:

     与上面基本同样的思路,java可以通过,但是还是属于暴力破解的范畴。

class Solution {
    public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
        int len = difficulty.length;
        int len2 = worker.length;
        int[][] works = new int [len][2];
        for(int i=0;i<len;i++){
             works[i][0]=difficulty[i];
             works[i][1]=profit[i];
        }
        Arrays.sort(works,(o1, o2) ->o2[1] - o1[1]);
        Arrays.sort(worker);
        int res = 0;
        int best = 0;
        for(int i=0;i<len2;i++){
            for(int j=0;j<len;j++){
                if(worker[i]>=works[j][0]){
                    best = Math.max(best,works[j][1]);
                }
            }
            res+=best;
        }
        return res;
    }
}

思路二:

参考大神版本的代码。

       使用 “双指针” 的方法去安排任务。我们记录最大可用利润 best。对于每个能力值为 w的工人,找到难度小于等于能力值的任务,并将如结果中。

最秀的操作在于 jobs = zip(difficulty,profit)。然后直接对jobs进行排序。

Python版本:

class Solution(object):
    def maxProfitAssignment(self, difficulty, profit, worker):
        jobs = zip(difficulty, profit)
        jobs.sort()
        ans = i = best = 0
        for w in sorted(worker):
            while i < len(jobs) and w >= jobs[i][0]:
                best = max(best, jobs[i][1])
                i += 1
            ans += best
        return ans

猜你喜欢

转载自blog.csdn.net/paranior/article/details/104315398