2023-07-23:给你 n 个任务和 m 个工人
每个任务需要一定的力量值才能完成
需要的力量值保存在下标从 0 开始的整数数组 tasks 中
第 i 个任务需要 tasks[i] 的力量才能完成
每个工人的力量值保存在下标从 0 开始的整数数组 workers 中
第 j 个工人的力量值为 workers[j]
每个工人只能完成 一个 任务
且力量值需要 大于等于 该任务的力量要求值, 即 workers[j] >= tasks[i]
除此以外,你还有 pills 个神奇药丸
可以给 一个工人的力量值 增加 strength
你可以决定给哪些工人使用药丸
但每个工人 最多 只能使用 一片 药丸。
给你下标从 0 开始的整数数组tasks 和 workers 以及
两个整数 pills 和 strength ,请你返回 最多 有多少个任务可以被完成。
来自华为。
输入:tasks = [3,2,1], workers = [0,3,3], pills = 1, strength = 1。
输出:3。
答案2023-07-23:
maxTaskAssign1:
1.对任务数组 tasks 和工人数组 workers 进行升序排序。
2.使用二分查找在任务数组 tasks 中找到一个索引 m,使得从 tasks[0] 到 tasks[m-1] 的任务可以被 workers[len(workers)-m] 到 workers[len(workers)-1] 完成。
3.判断使用药丸后,从 tasks[m] 到 tasks[len(tasks)-1] 的剩余任务是否能够被剩余的工人完成。
4.如果可以完成,则继续在右半部分寻找更大的 m 值;如果无法完成,则在左半部分寻找更小的 m 值。
5.返回最终的 m 值,即最多可以完成的任务数。
maxTaskAssign2:
1.对任务数组 tasks 和工人数组 workers 进行升序排序。
2.使用二分查找在任务数组 tasks 中找到一个索引 m,使得从 tasks[0] 到 tasks[m-1] 的任务可以被 workers[len(workers)-m] 到 workers[len(workers)-1] 完成。
3.使用辅助数组 help 存储满足条件的任务索引。
4.从 workers[wl] 到 workers[wr] 遍历每个工人,依次分配任务。
5.在任务数组 tasks 中,使用双指针 l 和 r,将满足 workers[wi]
6.如果 l < r,则说明有任务可以被工人完成,将任务数加一,并将 r 减一。
7.如果 l >= r,则说明无法完成任务,返回一个很大的值。
8.返回最终的任务数。
算法maxTaskAssign1的时间复杂度为O(n log n + m log m),空间复杂度为O(n + m)。
算法maxTaskAssign2的时间复杂度为O((n + m) log n),空间复杂度为O(n)。
go完整代码如下:
在这里插入图片描述rust完整代码如下:
在这里插入图片描述c++代码如下:
在这里插入图片描述c完整代码如下:
在这里插入图片描述
领取专属 10元无门槛券
私享最新 技术干货