1. 程式人生 > 其它 >|NO.Z.00051|——————————|^^ 部署 ^^|——|Linux&Apache.V02|

|NO.Z.00051|——————————|^^ 部署 ^^|——|Linux&Apache.V02|

跳躍遊戲

題目:跳躍遊戲

《程式設計師程式碼面試指南》第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;
}