LeetCode hot100-78

https://leetcode.cn/problems/jump-game/description/?envType=study-plan-v2\&envId=top-100-liked

java 复制代码
55. 跳跃游戏
中等
相关标签
相关企业
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

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

贪心算法,第一次做做不出来我原谅自己。看着代码多么简洁啊。官方分析也写得挺好的。注意下为什么要写if(i<=rightmost)因为比如这个例子nums =

3,2,1,0,4。到数字0那里不应该往后走了的,因为前面的那几个数字最多只走到0那里,如果不加限制条件就会直接往后循环,肯定能走到最后啊。

官方分析如下

java 复制代码
设想一下,对于数组中的任意一个位置 y,我们如何判断它是否可以到达?根据题目的描述,只要存在一个位置 x,它本身可以到达,并且它跳跃的最大长度为 x+nums[x],这个值大于等于 y,即 x+nums[x]≥y,那么位置 y 也可以到达。

换句话说,对于每一个可以到达的位置 x,它使得 x+1,x+2,⋯,x+nums[x] 这些连续的位置都可以到达。

这样以来,我们依次遍历数组中的每一个位置,并实时维护 最远可以到达的位置。对于当前遍历到的位置 x,如果它在 最远可以到达的位置 的范围内,那么我们就可以从起点通过若干次跳跃到达该位置,因此我们可以用 x+nums[x] 更新 最远可以到达的位置。

在遍历的过程中,如果 最远可以到达的位置 大于等于数组中的最后一个位置,那就说明最后一个位置可达,我们就可以直接返回 True 作为答案。反之,如果在遍历结束后,最后一个位置仍然不可达,我们就返回 False 作为答案。
java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int rightmost=0;
        int length = nums.length;
        for(int i=0;i<length;i++){
            if(i<=rightmost){
                rightmost=Math.max(rightmost,i+nums[i]);
                if(rightmost>=length-1){
                    return true;
                }
            }
        }
        return false;
    }
}
相关推荐
O。O蛋黄酥啊13 分钟前
GraphRAG 和 LightRAG 详解与对比
人工智能·python·算法·rag·graphrag·lightrag
Σίσυφος190016 分钟前
depth_from_focus 详解
算法
圣保罗的大教堂19 分钟前
leetcode 2996. 大于等于顺序前缀和的最小缺失整数 简单
leetcode
疯狂打码的少年27 分钟前
【数据结构】八大排序算法对比总结(时间/空间/稳定性)
数据结构·笔记·算法
树獭哥37 分钟前
量化金融入门:从数据规则到随机游走与凯利公式
人工智能·算法·金融·量化金融
圣保罗的大教堂43 分钟前
leetcode 3702. 按位异或非零的最长子序列 中等
leetcode
薛定e的猫咪1 小时前
(arXiv 2026)GLiBRL :可学习基函数的深度贝叶斯元强化学习 ----待补充
人工智能·深度学习·学习·算法·机器学习
hetao17338372 小时前
2026-08-21~23 hetao1733837 的刷题记录
c++·算法
青 春 记 忆2 小时前
LeetCode 206. 反转链表|Python 解法详解
python·leetcode·链表