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

跳跃游戏

问题描述

给你一个非负整数数组 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;

}

相关推荐
老鼠只爱大米几秒前
LeetCode经典算法面试题 #98:验证二叉搜索树(递归法、迭代法等五种实现方案详解)
算法·leetcode·二叉树·递归·二叉搜索树·迭代
疯狂的喵5 小时前
C++编译期多态实现
开发语言·c++·算法
scx201310045 小时前
20260129LCA总结
算法·深度优先·图论
2301_765703145 小时前
C++中的协程编程
开发语言·c++·算法
m0_748708055 小时前
实时数据压缩库
开发语言·c++·算法
小魏每天都学习6 小时前
【算法——c/c++]
c语言·c++·算法
智码未来学堂6 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法
Halo_tjn6 小时前
基于封装的专项 知识点
java·前端·python·算法
春日见7 小时前
如何避免代码冲突,拉取分支
linux·人工智能·算法·机器学习·自动驾驶
副露のmagic7 小时前
更弱智的算法学习 day59
算法