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

跳跃游戏

问题描述

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

}

相关推荐
white-persist1 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
FL16238631291 小时前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
baizhigangqw2 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹2 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25013 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-1301233 小时前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥4 小时前
C++类和对象
开发语言·c++·算法
加农炮手Jinx4 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla4 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx4 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣