https://leetcode.com/problems/jump-game/description/
题目:判断是否可以跳到最后一个节点?
解法一:只要有一个可达的子节点能够到达最后一个节点,该节点即可到达最后一个子节点,否则无法到达。我们从后往前遍历。 例如: (0表示不可达,1表示可达)
3 2 1 0 4
0 0 0 0 1
所以我们得出不可达。
class Solution {
public:
bool canJump(vector<int>& nums) {
int len=nums.size(),temp;
int *B=new int[len];
for(int x=len-1;x>=0;x--) {
B[x]=(x==len-1)?1:0;
for(int y=1;y<=nums[x]&&x+y<len;y++){
if(B[x+y]==1){
B[x]=1;
break;
}
}
}
temp=B[0];
delete [] B;
return temp;
}
};
解法二:贪心。
黑色即为 fast 。黄线表示fast内部的线,我们并不需要考虑内部线,因为对于1号节点来说,它可以到达2,3号节点,但是后面我们会再一次判断2,3号节点。所以会重复,因此我们每次只需要考虑fast以外的点即可。
class Solution {
public:
bool canJump(vector<int>& nums) {
int fast=nums[0],len=nums.size();
for(int x=1;x<len;x++)
fast=(x<=fast&&x+nums[x]>fast)?x+nums[x]:fast;
return fast>=len-1;
}
};