Solution 1: backtrack
感觉思路是没有什么问题,但是一旦输入的数组过长,就会TLE,要不就MLE
像是input这种 [5,6,4,4,6,9,4,4,7,4,4,8,2,6,8,1,5,9,6,5,2,7,9,7,9,6,9,4,1,6,8,8,4,4,2,0,3,8,5]
class Solution {
public int jump(int[] nums) {
if(nums.length==1)return 0;
int min=Integer.MAX_VALUE;
int des=nums.length-1;
List<Integer> list=new ArrayList<Integer>();
backtrack(0,0,nums,des,list);
for(int k:list){
min=Math.min(k,min);
// System.out.println("**"+k);
}
return min;
}
public void backtrack(int t,int len, int[] nums,int des,List<Integer> list){
if(len>=des)return;
for(int i=1;i<=nums[len];i++){
if(len+i<=des){
len+=i;
if(len==des){
list.add(t+1);
// System.out.println(t+1);
}
backtrack(t+1,len,nums,des,list);
len-=i;
}
}
}
}
Solution 2: 非常牛逼的贪心算法
public int jump(int[] nums) {
int curEnd = 0;
int cufFarthest = 0;
int jumpStep = 0;
for (int i = 0; i <nums.length -1 ; i++) {
cufFarthest = Math.max(cufFarthest, nums[i] + i);
if(i == curEnd)
{
jumpStep++;
curEnd = cufFarthest;
}
if(curEnd >= nums.length -1)break;
}
return jumpStep;
}