leetcode45:Jump Game II
阿新 • • 發佈:2018-12-11
1.首先選用了dp來做,結果超時了。
程式碼:
public class JumpGameII45 { public static void main(String[] args) { int[] nums = {2,3,1,1,4}; System.out.println(jump(nums)); } public static int jump(int[] nums) { int[] dp =new int[nums.length]; for (int i = 0; i < dp.length; i++) { for (int j = i+1; j <=i+nums[i]&&j<nums.length; j++) { if(dp[j]==0) dp[j]=dp[i]+1; } } return dp[nums.length-1]; } }
輸出:2
2.採用貪心來做,可以過。
思路:為了較快的跳到末尾,我們想知道每一步能跳的範圍,這裡貪婪並不是要在能跳的範圍中選跳力最遠的那個位置,因為這樣選下來不一定是最優解,這麼一說感覺又有點不像貪婪演算法了。我們這裡貪的是一個能到達的最遠範圍,我們遍歷當前跳躍能到的所有位置,然後根據該位置上的跳力來預測下一步能跳到的最遠距離,貪出一個最遠的範圍,一旦當這個範圍到達末尾時,當前所用的步數一定是最小步數。我們需要兩個變數cur和pre分別來儲存當前的能到達的最遠位置和之前能到達的最遠位置,只要cur未達到最後一個位置則迴圈繼續,pre先賦值為cur的值,表示上一次迴圈後能到達的最遠位置,如果當前位置i小於等於pre,說明還是在上一跳能到達的範圍內,我們根據當前位置加跳力來更新cur,更新cur的方法是比較當前的cur和i + A[i]之中的較大值,如果題目中未說明是否能到達末尾,我們還可以判斷此時pre和cur是否相等,如果相等說明cur沒有更新,即無法到達末尾位置,返回-1。
程式碼:
public static int jump(int[] nums) {
int res = 0;
int cur = 0, pre = 0, i = 0;
while (cur < nums.length-1) {
res++;
pre = cur;
for (; i <= pre; i++)
cur = Math.max(cur, i + nums[i]);
}
return res;
}