面试经典150题 day9
题目来源
我的题解
方法一 动态规划+双重循环
使用一个dp表记录i位置是否可达,然后在判断是否可达时需要看前面的nums[j]+j>=i&&dp[j]。
时间复杂度 :O( n 2 n^2 n2)
空间复杂度:O(n)
java
public boolean canJump(int[] nums) {
int n=nums.length;
boolean[] dp=new boolean[n];
dp[0]=true;
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(nums[j]+j>=i&&dp[j])
dp[i]=true;
}
}
return dp[n-1];
}
方法二 贪心
记录当前能够达到的最大位置,若能达到的最大位置小于当前位置,则返回false;若能达到的最大位置大于等于n-1,则返回true,其他情况返回false。
时间复杂度:O(n)空间复杂度:O(1)
java
public boolean canJump(int[] nums) {
int n=nums.length;
int maxIndex=0;
for(int i=0;i<n;i++){
if(maxIndex<i)
return false;
maxIndex=Math.max(maxIndex,nums[i]+i);
if(maxIndex>=n-1)
return true;
}
return false;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~