Loading

跳跃游戏

跳跃游戏

题目:跳跃游戏

《程序员代码面试指南》第74题 P247 难度:士★☆☆☆

这题在左神的书上是最简单的“士”难度,不过在力扣上起码是中等难度(力扣上跳跃游戏从I到VII,有中等有困难),自己做起来感觉不是特别简单,稍微想了一会儿。

书中具体过程如下:

  1. 定义整型变量jump,代表目前跳了多少步。整型变量cur,代表如果只能跳jump步最远能够到达的位置。整型变量next,代表如果再多跳一步最远能够到达的位置。初始时,jump=0,cur=0,next=0。
  2. 从左到右遍历arr,假设遍历到位置i。
    1. 如果cur≥i,说明跳jump步可以到达位置i,此时什么也不做
    2. 如果cur<i,说明只跳jump步不能到达位置i,需要多跳一步才行。此时令jump++cur=next。表示多跳了一步,cur更新成跳jump+1步能够到达的位置,即next
    3. next更新成math.max(next,i+arr[i]),表示下一次多跳一步到达的最远位置
  3. 最终返回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;
}
posted @ 2022-03-29 11:42  幻梦翱翔  阅读(35)  评论(0)    收藏  举报