Lintcode : 116. 跳躍遊戲
阿新 • • 發佈:2018-12-13
給出一個非負整數陣列,你最初定位在陣列的第一個位置。
陣列中的每個元素代表你在那個位置可以跳躍的最大長度。
判斷你是否能到達陣列的最後一個位置。
public boolean canJump(int[] A) { // write your code here if (A[0] == 0 && A.length != 1) return false; boolean canJump = false; int zeroPos = -1; for (int i = 0; i < A.length; i++) { if (A[i + A[i]] == 0) zeroPos = i + A[i]; if (A[i] == 0 && i == A.length - 1) return true; if (A[i] + i >= A.length -1 ) return true; if (A[i+A[i]] == 0 && i+A[i] == A.length -1) return true; else if (A[i + A[i]] == 0) { if (zeroPos == i) return false; zeroPos = i+A[i]; continue; } i = A[i] + i - 1; } return canJump; }
dalao思路:
public boolean canJump2(int[] A) { // write your code here if (A == null) return false; int n = A.length; if (n < 2) return true; int curMax = 0; for (int i = 0; i < n; i++) { if (i <= curMax) curMax = Math.max(i + A[i], curMax); //max/min 貪心的關鍵 } return curMax >= n - 1; }
dalao思路:只是討論是否能達到終點的話 ,在小於當前最大點遍歷的每一步都討論是否能得到更大的一步,最終遍歷完後如果大於長度,那就可以到達
summary:貪心策略,需要獲得全域性的最優結果,但遍歷得每一步只能得到區域性的結局/區域性最優結果,同時在處理區域性的時候 還要注意會不會出現更好的結果,有則更新 之前一直困擾於遍歷到i的時候就直接跳到a[a[i]]的結果,忽視了過程中可能會出現更好的結果