class Solution {
//递归+记忆集
public boolean canJump(int[] nums) {
return recur(0,nums,new int[nums.length])==1?true:false;
}
public int recur(int n,int[] nums,int[] visited){
if(n==nums.length-1 || visited[n]==1) return 1;
if(n<0||n>nums.length-1 || visited[n]==-1) return -1;
visited[n] = -1;
for(int i=1;i<=nums[n];i++){
if(recur(n+i,nums,visited)==1) {
visited[n] = 1;
return 1;
}
}
return -1;
}
//贪心算法
public boolean canJump(int[] nums) {
int max=nums[0];
for(int i=0;i<nums.length;i++){
if(i>max) return false;
if(max>=nums.length-1) return true;
max = Math.max(max,i+nums[i]);
}
return false;
}
}
和上一个Leetcode55题的区别就是加了一个最少跳跃次数,仍然用贪心算法即可
class Solution {
public int jump(int[] nums) {
int endPosision = 0,maxPosition = 0,steps = 0;
for(int i=0;i<nums.length-1;i++){
maxPosition = Math.max(maxPosition,nums[i]+i);
if(i==endPosision){
endPosision = maxPosition;
steps++;
}
}
return steps;
}
}