算法通关村-----跳跃游戏问题

跳跃游戏

问题描述

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

详见leetcode55

问题分析

我们不应该考虑具体跳到哪个位置,而是应该考虑跳到当前位置后所能覆盖的最大范围,并考虑当前位置和最大覆盖范围位置之间所有位置的最大覆盖范围,不断更新最大覆盖范围,如果最大覆盖范围包括或者超过数组的最后一个元素,则可以到达,否则不可以到达。

代码实现

java 复制代码
public boolean canJump(int[] nums) {
    int cover = 0;
    for(int i=0;i<=cover;i++){
        cover = Math.max(cover,i+nums[i]);
        if(cover>=nums.length-1){
            return true;
        }
    }
    return false;
}

最短跳跃游戏

问题描述

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]

i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

详见leetcode45

问题分析

可以使用贪心+双指针的方式实现。同样的,我们需要考虑跳到当前位置后所能覆盖的最大范围,并考虑当前位置和最大覆盖范围位置之间所有位置的最大覆盖范围。设置四个变量,left用来遍历数组,right,当前位置所能到的边界,steps记录到达边界所需要的步数,max记录left到right过程中的最大覆盖范围,当left与right相遇时,更新right和steps


代码实现

public int jump(int[] nums) {

if(nums.length1){
return 0;
}
int right = 0;
int steps = 0;
int max = 0;
for (int left = 0; left < nums.length; left++) {
max = Math.max(max, left + nums[left]);
if(leftright){

steps++;

right = max;

}

if(right>=nums.length-1){

return steps;

}

}

return steps;

}

相关推荐
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法
moonlifesudo1 天前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法