/** 从i=0开始遍历,每次更新所能达到的最远距离,如果循环break之后最远距离超过len则能够到达最后一个位置; 但是并不需要具体计算出每次需要跳到哪个台阶;如果需要找出所有可能的结果呢? 以动态规划的思路考虑: i=0->len-1: dp[i] 为走完第i个台阶所能到达的最远位置,那么他就是在之前所能到达的最远位置和本次所能到达最远位置之间取最大值; 即dp[i]=max(dp[i-1],nums[i]+i),且i的范围在0~l_max之间,即在能够到达的范围内更新l_max; **/ class Solution { public: bool canJump(vector<int>& nums) { int len=nums.size(); int l_max=0; for(int i=0;i<=l_max&&i<len;i++){ l_max=max(l_max,nums[i]+i); } return l_max>=len-1; } };
应用贪心算法:每次遍历范围为当前能达到的最远距离,如果将当前能达到的所有点全部遍历完成后,最大距离仍然没有超过终点,那么则不能到达终点;如果能到达的最大距离nums[i]+i大于当前能到的最大点t,那么更新t;
class Solution { public: bool canJump(vector<int>& nums) { //贪心算法:每次在可到达范围内的点,更新能到达的最远距离,如果最终这个距离大于len则说明可以到达终点,时间复杂度O(n); int len=nums.size(); if(len==0) return true; int t=0; for(int i=0;i<=t&&i<len;i++){ t=max(t,i+nums[i]); } return t>=len-1; } };