Problem
Notes
第一反应是dp题,dp[i]记录是否能从0下标跳到1,能的话赋值为1,否则为0。提交虽然过了,但时间很长。
在对第一次的提交做优化时想到,其实第二层循环完全可以不用,因为我们只关心能不能到最后,那么我们在外层循环i时,用一个常量记录,在0~i这个范围内,能跳到最远的下标就行,若i大于了这个常量,则证明0~i范围内跳不到i下标标注的位置,那么肯定也就跳不到最后。这其实就是一种贪心的思想。
Codes
方法一:
class Solution {
public:
bool canJump(vector<int>& nums) {
int len=nums.size();
if(!len) return false;
int dp[len];
for(int i=0;i<len;++i)
dp[i]=0;
dp[0]=1;
for(int i=0;i<len;++i)
{
if(dp[i])
{
for(int j=0;j<=nums[i];++j)
{
if(i+j>=len) return true;
dp[i+j]=1;
}
}
else break;
}
if(dp[len-1]) return true;
else return false;
}
};
方法二:
class Solution {
public:
bool canJump(vector<int>& nums) {
int len=nums.size();
if(!len) return false;
int maxlen=0;
for(int i=0;i<len;++i)
{
if(i>maxlen) return false;
maxlen=maxlen>i+nums[i]?maxlen:i+nums[i];
if(maxlen>=len-1)
return true;
}
return false;
}
};