问题描述:
有一些工作: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:
先按照降序排列的顺序,记录收益(也是对应工作难度的原本索引值),再将收益降序排列。
然后将工人的能力升序排列,那么后面的工人一定能取到比前一个工人更高的利润,使用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