目录
题目描述:
你有 n 个工作和 m 个工人。给定三个数组: difficulty, profit 和 worker ,其中:
difficulty[i] 表示第 i 个工作的难度,profit[i] 表示第 i 个工作的收益。
worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。
每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次 。
举个例子,如果 3 个工人都尝试完成一份报酬为 $1 的同样工作,那么总收益为 $3 。如果一个工人不能完成任何工作,他的收益为 $0 。
返回 在把工人分配到工作岗位后,我们所能获得的最大利润 。
示例 1:
输入: 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] 的收益。
示例 2:
输入: difficulty = [85,47,57], profit = [24,66,99], worker = [40,25,25]
输出: 0
思路描述:
思路1:最简单,就是用两个指针,分别指向工人数组和工作量的数组,每遍历到一个工人,就从头遍历一下工作量数组,找自己可以干的最大收益的工作,这种思路的时间复杂度为0(n^2)。
思路2:先对工人数组按照其能力进行排序,然后再将工作量和收益进行排序,还是利用双指针,遍历每个工人,找工作量数组中其能干的最大收益的工作,每个指针只需要便利一边数组即可完成工作,实践复杂度为O(n)。
代码:
思路一:
class Solution {
public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
int maxValue=0;
int n=worker.length;
int m=difficulty.length;
for(int i=0;i<n;i++){
int maxProfit=0;
for(int j=0;j<m;j++){
if(difficulty[j]<=worker[i]){
maxProfit=Math.max(profit[j],maxProfit);
}
}
maxValue+=maxProfit;
}
return maxValue;
}
}
思路二:
class Solution {
public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
int maxValue=0;
int n=worker.length;
int m=difficulty.length;
Arrays.sort(worker);
List<MyNode> list=new ArrayList<>();
for(int i=0;i<m;i++){
MyNode myNode=new MyNode();
myNode.profit=profit[i];
myNode.work=difficulty[i];
list.add(myNode);
}
list.sort((x, y) -> {
return x.work - y.work;
});
int curMaxValue=0;
int pIndex=0;
int wIndex=0;
while (wIndex<n){
while (pIndex<m && list.get(pIndex).work<=worker[wIndex]){
curMaxValue=Math.max(list.get(pIndex).profit,curMaxValue);
pIndex++;
}
maxValue+=curMaxValue;
wIndex++;
}
return maxValue;
}
class MyNode{
int work;
int profit;
}
}