[杨小白]_leetcode_力扣_第 93 场双周赛-第三题

193 阅读2分钟

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

前言

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

力扣第 93 场双周赛-力扣

第 93 场双周赛

参赛的人越来越少了,可算是跌破了3000了

近几次排名对比。今天第四题rj了,排名上升了,到249了。

image.png

image.png

image.png

image.png

2498. 青蛙过河 II

给你一个下标从 0 开始的整数数组 stones ,数组中的元素 严格递增 ,表示一条河中石头的位置。

一只青蛙一开始在第一块石头上,它想到达最后一块石头,然后回到第一块石头。同时每块石头 至多 到达 一次。

一次跳跃的 长度 是青蛙跳跃前和跳跃后所在两块石头之间的距离。

更正式的,如果青蛙从 stones[i] 跳到 stones[j] ,跳跃的长度为 |stones[i] - stones[j]| 。 一条路径的 代价 是这条路径里的 最大跳跃长度 。

请你返回这只青蛙的 最小代价 。

示例1:

image.png

输入:stones = [0,2,5,6,7]

输出:5

解释:上图展示了一条最优路径。

这条路径的代价是 5 ,是这条路径中的最大跳跃长度。

无法得到一条代价小于 5 的路径,我们返回 5 。

示例 2:

image.png

输入:stones = [0,3,9]

输出:9

解释:

青蛙可以直接跳到最后一块石头,然后跳回第一块石头。

在这条路径中,每次跳跃长度都是 9 。所以路径代价是 max(9, 9) = 9 。

这是可行路径中的最小代价。

提示:

  • 2 <= stones.length <= 105
  • 0 <= stones[i] <= 109
  • stones[0] == 0
  • stones 中的元素严格递增。

代码

这个题真是想明白之后简单的离谱。最开始想,这应该得用动态规划吧,但是数据量太大了,肯定超时啊。

最后自己手玩了一下,用一点数学基础,就发现了规律。

有下面这几个结论:

  1. 一个石头,可以选择踩或者不踩,踩的结果一定小于等于不踩的结果。

    例如示例2的0,3,9.题目给的示例是0直接到9,回来是直接9到0,那么如果去的时候踩了3的石头,可以将去的9分为3+6,所以,一个石头踩或者不踩,踩的结果一定小于等于不踩的结果。

  2. 如果已知了从0到n - 1块石头的结果。说明可以从0跳到n - 1,并从n - 1跳回0,此时如果需要跳到n,再从n跳到0,则需要建立从n - 1 到n的连接,最小为n到n-2的距离。

    这里运用到了1的结论,从0 先跳到n - 1, 然后建立n - 1到n的连接来说,有两种方式,(1)n - 1直接跳到n,从小于n - 1的跳到n。

    因为离n-1最近的是n-2,根据定理1,踩了n-2一定比不踩n-2要小或者等于。所以,n-2一定是会踩的,那么我们可以踩完n - 2 再踩n,再踩n - 1 再回到0

    循环判断最大值和n-2 到 n 的距离即可。

class Solution {
    public int maxJump(int[] stones) {
        int len = stones.length;
        int res = stones[len - 1] - stones[len - 2];
        for (int i = len - 3; i >= 0; i--) {
            int a = stones[i];
            int b = stones[i + 2] - a;
            res = Math.max(b, res);
        }
        return res;
    }
}

3.结束

也算是三题手速场,第四题wa了一个案例,就很生气。。。不过就算做了四题,也上不了几名。

小上一波分。

image.png

image.png