LeetCode Day44 Jump Game

贪婪算法Greedy Algorithm

维护一个变量reach,表示最远能到达的位置,初始化为0。遍历数组中每一个数字,如果当前坐标大于reach,false;或者reach已经抵达最后一个位置则跳出循环,true.更新reach的值为其和i + nums[i]中的较大值,其中i + nums[i]表示当前位置能到达的最大位置

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size(),reach=0;
        for(int i=0;i<n;i++){
            if(reach>=n-1) return true;
            if(reach < i) return false;
            reach = max(reach,i+nums[i]);
        }
    }
};

动态规划Dynamic Programming

维护一个数组dp,其中dp[i]表示达到i位置时剩余的步数.到达当前位置的剩余步数跟上一个位置的剩余步数和上一个位置的跳力有关,这里的跳力就是原数组中每个位置的数字,因为其代表了以当前位置为起点能到达的最远位置。所以当前位置的剩余步数(dp值)和当前位置的跳力中的较大那个数决定了当前能到的最远距离,而下一个位置的剩余步数(dp值)就等于当前的这个较大值减去1,因为需要花一个跳力到达下一个位置,所以我们就有状态转移方程了:

dp[i] = max(dp[i - 1], nums[i - 1]) - 1

如果当某一个时刻dp数组的值为负了,说明无法抵达当前位置,则直接返回false.

class Solution {
public:
    bool canJump(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        for (int i = 1; i < nums.size(); ++i) {
            dp[i] = max(dp[i - 1], nums[i - 1]) - 1;
            if (dp[i] < 0) return false;
        }
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/84640360