comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
困难 |
1900 |
第 216 场周赛 Q4 |
|
给你一个任务数组 tasks
,其中 tasks[i] = [actuali, minimumi]
:
actuali
是完成第i
个任务 需要耗费 的实际能量。minimumi
是开始第i
个任务前需要达到的最低能量。
比方说,如果任务为 [10, 12]
且你当前的能量为 11
,那么你不能开始这个任务。如果你当前的能量为 13
,你可以完成这个任务,且完成它后剩余能量为 3
。
你可以按照 任意顺序 完成任务。
请你返回完成所有任务的 最少 初始能量。
示例 1:
输入:tasks = [[1,2],[2,4],[4,8]] 输出:8 解释: 一开始有 8 能量,我们按照如下顺序完成任务: - 完成第 3 个任务,剩余能量为 8 - 4 = 4 。 - 完成第 2 个任务,剩余能量为 4 - 2 = 2 。 - 完成第 1 个任务,剩余能量为 2 - 1 = 1 。 注意到尽管我们有能量剩余,但是如果一开始只有 7 能量是不能完成所有任务的,因为我们无法开始第 3 个任务。
示例 2:
输入:tasks = [[1,3],[2,4],[10,11],[10,12],[8,9]] 输出:32 解释: 一开始有 32 能量,我们按照如下顺序完成任务: - 完成第 1 个任务,剩余能量为 32 - 1 = 31 。 - 完成第 2 个任务,剩余能量为 31 - 2 = 29 。 - 完成第 3 个任务,剩余能量为 29 - 10 = 19 。 - 完成第 4 个任务,剩余能量为 19 - 10 = 9 。 - 完成第 5 个任务,剩余能量为 9 - 8 = 1 。
示例 3:
输入:tasks = [[1,7],[2,8],[3,9],[4,10],[5,11],[6,12]] 输出:27 解释: 一开始有 27 能量,我们按照如下顺序完成任务: - 完成第 5 个任务,剩余能量为 27 - 5 = 22 。 - 完成第 2 个任务,剩余能量为 22 - 2 = 20 。 - 完成第 3 个任务,剩余能量为 20 - 3 = 17 。 - 完成第 1 个任务,剩余能量为 17 - 1 = 16 。 - 完成第 4 个任务,剩余能量为 16 - 4 = 12 。 - 完成第 6 个任务,剩余能量为 12 - 6 = 6 。
提示:
1 <= tasks.length <= 105
1 <= actuali <= minimumi <= 104
我们假设任务数为
我们可以将
整理可得:
其中
因此,我们可以将任务按照
时间复杂度
class Solution:
def minimumEffort(self, tasks: List[List[int]]) -> int:
ans = cur = 0
for a, m in sorted(tasks, key=lambda x: x[0] - x[1]):
if cur < m:
ans += m - cur
cur = m
cur -= a
return ans
class Solution {
public int minimumEffort(int[][] tasks) {
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - (a[1] - b[1]));
int ans = 0, cur = 0;
for (var task : tasks) {
int a = task[0], m = task[1];
if (cur < m) {
ans += m - cur;
cur = m;
}
cur -= a;
}
return ans;
}
}
class Solution {
public:
int minimumEffort(vector<vector<int>>& tasks) {
sort(tasks.begin(), tasks.end(), [&](const auto& a, const auto& b) { return a[0] - a[1] < b[0] - b[1]; });
int ans = 0, cur = 0;
for (auto& task : tasks) {
int a = task[0], m = task[1];
if (cur < m) {
ans += m - cur;
cur = m;
}
cur -= a;
}
return ans;
}
};
func minimumEffort(tasks [][]int) (ans int) {
sort.Slice(tasks, func(i, j int) bool { return tasks[i][0]-tasks[i][1] < tasks[j][0]-tasks[j][1] })
cur := 0
for _, task := range tasks {
a, m := task[0], task[1]
if cur < m {
ans += m - cur
cur = m
}
cur -= a
}
return
}
function minimumEffort(tasks: number[][]): number {
tasks.sort((a, b) => a[0] - a[1] - (b[0] - b[1]));
let ans = 0;
let cur = 0;
for (const [a, m] of tasks) {
if (cur < m) {
ans += m - cur;
cur = m;
}
cur -= a;
}
return ans;
}