[杨小白]_leetcode_力扣_1900分的题_1665. 完成所有任务的最少初始能量

217 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标1900分,现在1806!!

因为已经上到1889了,去rating找了1900分左右的题做了一下

image.png

1665. 完成所有任务的最少初始能量

给你一个任务数组 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 。

代码

长度100,本以为可以用递归搜索,结果好像不太行,代码如代码一,下面这个示例过不去,但是如果面试手撕的时候,可以两个方法都试试,应该会是加分项。

首先,我们可以知道,最后完成的一定是actuali - minimumi最小的那一个任务。

最少的能量 = 完成所有任务的能量 + 剩余的能量。

第一项是固定的,也就是剩余的能量需要最小。

按照剩余能量降序排序后贪心。

class Solution {
    public int minimumEffort(int[][] tasks) {
        int[][] ints = new int[tasks.length][3];
        for (int i = 0; i < tasks.length; i++) {
            ints[i][0] = tasks[i][0];
            ints[i][1] = tasks[i][1];
            ints[i][2] = tasks[i][1] - tasks[i][0];
        }
        Arrays.sort(ints, (o1, o2) -> o1[2] - o2[2]);
        int res = ints[0][2];
        for (int i = 0; i < tasks.length; i++) {
            if (res + ints[i][0] >= ints[i][1]) {
                res = ints[i][0] + res;
            } else {
                res = ints[i][1];
            }
        }
        return res;
    }
}