开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1916!!
力扣第 93 场双周赛-力扣
第 93 场双周赛
参赛的人越来越少了,可算是跌破了3000了
近几次排名对比。今天第四题rj了,排名上升了,到249了。
2498. 青蛙过河 II
给你一个下标从 0 开始的整数数组 stones ,数组中的元素 严格递增 ,表示一条河中石头的位置。
一只青蛙一开始在第一块石头上,它想到达最后一块石头,然后回到第一块石头。同时每块石头 至多 到达 一次。
一次跳跃的 长度 是青蛙跳跃前和跳跃后所在两块石头之间的距离。
更正式的,如果青蛙从 stones[i] 跳到 stones[j] ,跳跃的长度为 |stones[i] - stones[j]| 。 一条路径的 代价 是这条路径里的 最大跳跃长度 。
请你返回这只青蛙的 最小代价 。
示例1:
输入:stones = [0,2,5,6,7]
输出:5
解释:上图展示了一条最优路径。
这条路径的代价是 5 ,是这条路径中的最大跳跃长度。
无法得到一条代价小于 5 的路径,我们返回 5 。
示例 2:
输入:stones = [0,3,9]
输出:9
解释:
青蛙可以直接跳到最后一块石头,然后跳回第一块石头。
在这条路径中,每次跳跃长度都是 9 。所以路径代价是 max(9, 9) = 9 。
这是可行路径中的最小代价。
提示:
2 <= stones.length <= 1050 <= stones[i] <= 109stones[0] == 0stones中的元素严格递增。
代码
这个题真是想明白之后简单的离谱。最开始想,这应该得用动态规划吧,但是数据量太大了,肯定超时啊。
最后自己手玩了一下,用一点数学基础,就发现了规律。
有下面这几个结论:
-
一个石头,可以选择踩或者不踩,踩的结果一定小于等于不踩的结果。
例如示例2的0,3,9.题目给的示例是0直接到9,回来是直接9到0,那么如果去的时候踩了3的石头,可以将去的9分为3+6,所以,一个石头踩或者不踩,踩的结果一定小于等于不踩的结果。
-
如果已知了从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了一个案例,就很生气。。。不过就算做了四题,也上不了几名。
小上一波分。