|NO.Z.00051|——————————|^^ 部署 ^^|——|Linux&Apache.V02|
阿新 • • 發佈:2022-03-25
跳躍遊戲
題目:跳躍遊戲
《程式設計師程式碼面試指南》第74題 P247 難度:士★☆☆☆
這題在左神的書上是最簡單的“士”難度,不過在力扣上起碼是中等難度(力扣上跳躍遊戲從I到VII,有中等有困難),自己做起來感覺不是特別簡單,稍微想了一會兒。
書中具體過程如下:
- 定義整型變數jump,代表目前跳了多少步。整型變數cur,代表如果只能跳jump步,最遠能夠到達的位置。整型變數next,代表如果再多跳一步,最遠能夠到達的位置。初始時,jump=0,cur=0,next=0。
-
從左到右遍歷arr,假設遍歷到位置i。
- 如果cur≥i,說明跳jump步可以到達位置i,此時什麼也不做。
- 如果cur<i
- 將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; }