55. 跳跃游戏

问题

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

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

示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

分析

第一反应是在[i, nums[i]]范围内选取最大值,仅仅考虑当前一步的贪心。但是代码不对,思考后发现,例如,[3,4,2,0,7,0,0,0,0,0,0],开始位于索引0,下一个选max{4,2,0}=4,也就是索引1,显然不对,应该选择索引2,这样刚好跳到下一步7,能够通过。

这个题标了贪心,应该是让我们学会区分贪心和dp,这个题个人认为更接近dp。

看了题解,正确思路是维护到达每个位置i时的最远可达位置。

代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n_n = nums.size();
        int x = 0; // 最远可到达位置
        for (int i = 0; i < n_n; i++) {
            if (i > x) {return false;}
            x = max(i + nums[i], x);
        }
        return true;
    }
};
posted @ 2025-06-19 14:27  saulstavo  阅读(17)  评论(0)    收藏  举报