跳跃游戏
跳跃游戏
题目:跳跃游戏
《程序员代码面试指南》第74题 P247 难度:士★☆☆☆
这题在左神的书上是最简单的“士”难度,不过在力扣上起码是中等难度(力扣上跳跃游戏从I到VII,有中等有困难),自己做起来感觉不是特别简单,稍微想了一会儿。
书中具体过程如下:
- 定义整型变量jump,代表目前跳了多少步。整型变量cur,代表如果只能跳jump步,最远能够到达的位置。整型变量next,代表如果再多跳一步,最远能够到达的位置。初始时,jump=0,cur=0,next=0。
- 从左到右遍历arr,假设遍历到位置i。
- 如果cur≥i,说明跳jump步可以到达位置i,此时什么也不做。
- 如果cur<i,说明只跳jump步不能到达位置i,需要多跳一步才行。此时令jump++,cur=next。表示多跳了一步,cur更新成跳jump+1步能够到达的位置,即next。
- 将next更新成math.max(next,i+arr[i]),表示下一次多跳一步到达的最远位置。
- 最终返回jump即可。
public int jump(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int jump = 0;
int cur = 0;
int next = 0;
for (int i = 0; i < arr.length; i++) {
if (cur < i) {
jump++;
cur = next;
}
next = Math.max(next, i + arr[i]);
}
return jump;
}
我自己的思路也差不多,每次计算第cnt步最远能够到达的位置,如果≥num.length-1,即最后一个位置,说明第cnt步最远可以达到最后的位置了。
贴上我的菜鸡代码:
private int jump(int[] num) {
if(num == null || num.length == 0 || num.length == 1)
return 0;
int cnt = 1, tmp;
int left = 1, right = num[0];
int max = right;
while(true) {
if(max >= num.length-1)
break;
for(int i=left; i<=right; i++) {
tmp = num[i] + i;
if(tmp > max)
max = tmp;
}
cnt++;
left = right + 1;
right = max;
}
return cnt;
}

浙公网安备 33010602011771号