**题目: **
你有 n 个工作和 m 个工人。给定三个数组: difficulty, profit 和 worker ,其中:
difficulty[i]表示第i个工作的难度,profit[i]表示第i个工作的收益。worker[i]是第i个工人的能力,即该工人只能完成难度小于等于worker[i]的工作。
每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次 。
- 举个例子,如果 3 个工人都尝试完成一份报酬为
$1的同样工作,那么总收益为$3。如果一个工人不能完成任何工作,他的收益为$0。
返回 在把工人分配到工作岗位后,我们所能获得的最大利润 。
算法:
因为不同的工人的工作没有冲突,先考虑一个工人的情况。
*方法一:排序 *
func maxProfitAssignment(difficulty []int, profit []int, worker []int) int {
ans := 0
arr := make([][]int, len(difficulty))
for i := range arr {
arr[i] = []int{difficulty[i], profit[i]}
}
sort.Slice(arr, func(i, j int) bool {return arr[i][0] < arr[j][0]})
for j := range worker {
p := 0
for k := 0; k < len(arr); k ++ {
if arr[k][0] > worker[j] {
break
}
if arr[k][1] > p {
p = arr[k][1]
}
}
ans = ans + p
}
return ans
}
- 57/57 cases passed (588 ms)
- Your runtime beats 7.35 % of golang submissions
- Your memory usage beats 79.41 % of golang submissions (6.6 MB)
方法二:对工人排序
worker按工作能力排序之后,比worker[i]工作能力差的人都能找到利润为p的工作,工作能力更强的人至少也能找到利润p的工作。 记录最大的利润p
实现arr和work数组的双指针
func maxProfitAssignment(difficulty []int, profit []int, worker []int) int {
ans := 0
arr := make([][]int, len(difficulty))
for i := range arr {
arr[i] = []int{difficulty[i], profit[i]}
}
sort.Slice(arr, func(i, j int) bool {return arr[i][0] < arr[j][0]})
sort.Ints(worker)
p := 0
k := 0
for j := range worker {
for k < len(arr) && arr[k][0] <= worker[j] {
if arr[k][1] > p {
p = arr[k][1]
}
k ++
}
ans = ans + p
}
return ans
}