55. 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
解法一 动态规划
class Solution { enum Index{GOOD,BAD,UNKNOWN}; vector<Index> memo; public: bool canJump(vector<int>& nums) { memo=vector<Index>(nums.size(),UNKNOWN); memo[nums.size()-1]=GOOD; for(int i=nums.size()-2;i>=0;i--){ int furthestJumpFromPosition=min(nums[i]+i,(int)nums.size()-1); for(int j=i+1;j<=furthestJumpFromPosition;j++){ if(memo[j]==GOOD){ memo[i]=GOOD; break; } } } return memo[0]==GOOD; } };
解法二 贪心算法
class Solution { public: bool canJump(vector<int>& nums) { int lastPos = nums.size() - 1; for (int i = nums.size() - 1; i >= 0; i--) { if (i + nums[i] >= lastPos) { lastPos = i; } } return lastPos == 0; } };