问题:
给定一个非负整数数组 [nums] ,开始时位于数组的初始位置 ;
数组中每个下标对应的元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达数组的最后位置。
思路:贪心算法
看不懂的可以去下面这个链接看 具体思路:跳跃游戏 b站详解
若是数组中的每一个元素值都大于0,无论怎么跳都可以到达最后的位置;
但是我们不知道数组中的0分布的位置,所以用贪心算法解决:
index是我们下一跳要跳到的最佳位置;
如下例所示,我们每次在 i 位置上可以跳跃到的最大位置max_jump= i+nums[i] ;当在 i=0上时候,我们可以最多跳四步,可以到 i=1,i=2,i=3,i=4;
那哪个位置最好呢,我们可以看到 i=1,2,3,4位置下对应的max_jump=5,4,6,5;显然i=3时候,max_jump最大,可以跳到6的位置,所以index=3;因为i=3,可以跳到最大位置6,其他 i对应的最大位置,i=3,都可以跳到;
//数组跳跃
public class One {
public static void main(String[] args) {
int[] arr = {2, 3, 4, 0, 0, 0, 0, 2};
ArrayList<Integer> list = new ArrayList<>();
System.out.println(can(arr, list));
}
public static boolean can(int[] arr, ArrayList<Integer> list) {
//先把计算出来的jump 即:每次最多可以跳得的最大位置存起来
for (int i = 0; i < arr.length; i++) {
list.add(i + arr[i]);//jump=i+arr[i]
}
int index = 1;//初始化索引 可以从1开始
int max_jump = list.get(0);
while (index < arr.length && index <= max_jump) {//当index达到数组尾部 或者超过max时,循环结束
//index>max的话,说明此时索引已经超出你能跳跃的范围 循环也就终止了
if (list.get(index) > max_jump) {
max_jump=list.get(index);
}
index++;//继续后移
}
//循环结束时候判断index与数组长度大小关系 若相等则说明该问题有解 可以跳跃到最后
if (index==arr.length){
return true;
}
return false;
}
}
2.优化以后的代码
重新整理了一下思路,只要max_jump>=数组的最大下标我们就可以跳过去
package 算法.贪心算法;
public class ArrJumpBetter {
public static void main(String[] args) {
int[] arr={2,3,5,0,0,0,0,2,0,0};
System.out.println(isCan(arr));
}
public static boolean isCan(int[] arr){
if (arr.length==1){
return true;
}
int max_jump=0;
//只要max_jump可以覆盖到数组的长度大小就说明可以跳过去
for (int i = 0; i <=max_jump ; i++) {
//但是我们每次最多只能跳到max_jump的位置
max_jump=Math.max(max_jump,i+arr[i]);
if (max_jump>=arr.length-1){
return true;
}
}
return false;
}
}