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

跳跃游戏

问题描述

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

}

相关推荐
蓑 羽2 分钟前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
源代码:趴菜5 分钟前
LeetCode63:不同路径II
算法·leetcode·职场和发展
儿创社ErChaungClub20 分钟前
解锁编程新境界:GitHub Copilot 让效率翻倍
人工智能·算法
前端西瓜哥24 分钟前
贝塞尔曲线算法:求贝塞尔曲线和直线的交点
前端·算法
小灰灰爱代码32 分钟前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
南加第一划水35 分钟前
Leetcode 每日一题:Evaluate Division
算法·leetcode·职场和发展
逝去的秋风1 小时前
【代码随想录训练营第42期 Day61打卡 - 图论Part11 - Floyd 算法与A * 算法
算法·图论·floyd 算法·a -star算法
zero_one_Machel1 小时前
leetcode73矩阵置零
算法·leetcode·矩阵
青椒大仙KI112 小时前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
^^为欢几何^^2 小时前
lodash中_.difference如何过滤数组
javascript·数据结构·算法