jump_game_II
题意: 给定一个由非负整数组成的数组,初始位置在数组中的第一个元素处,数组中每一个元素的值表示你从当前位置最多可以跳的长度。要求使用最少的条数到达最后一个位置。
举例: A =[2,3,1,1,4], 最少的条数是2.
分析: 本题当然可以使用动态规划来求解,只是还有更简单的方法,那就是贪心。我们用到的贪心策略思想是:扫描所有能到达的点,选择跳到在该点处能跳到的最远处。假设到达了位置i处,在i处的值是A[i],则从i处开始向后遍历A[i]个数,如果能够到达最后一个数了,就直接返回当前已有跳数加1,否则,取遍历过程中的j - i + A[j]最大的,即能跳的最远的那个,j为i向后遍历了j个数,
0≤j≤A[i]
,我们计能跳最远的位置是j_max,则从i跳到j_max位置,再继续执行。
代码
public int jump(int[] A) {
int begin = 0; //从0的位置开始向后遍历
int jump = 0; //最少需要跳多少次
while(begin < A.length){
if(A[begin] == 0 || A.length == 1){ //如果某一个的值是0,则永远都不能到达,返回负数。
return 0;
}else if(begin + A[begin] >= A.length - 1){ //如果在跳得范围内可以到最后一个,就直接返回结果。
return jump + 1;
}
else{
int max = A[begin]; //max表示这一条和下一条之和最大的值,初始表示不跳。
int max_index = begin; //取得最大值时,在数组中的索引
for(int i = begin + 1; i <= begin + A[begin]; i++){ //从begin的后一个开始查找,找最大可以跳的值
if(i - begin + A[i] > max){
max_index = i;
max = i - begin + A[i];
}
}
jump++;
begin = max_index;
}
}
return jump;
}
jump_game
题意: 在II的基础上,修改为判断是否能够到达最后一个位置。
举例: A =[2,3,1,1,4], return true.
A =[3,2,1,0,4], return false.
分析: 该题采用和jump_game_II完全一样的解题方法即可。