826.安排工作以达到最大收益

91 阅读1分钟

**题目: ** 你有 n 个工作和 m 个工人。给定三个数组: difficultyprofit 和 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
}