遞歸和動態規劃問題:跳躍遊戲

題目數組

  給定數組 arr, arr[i] = k 表明能夠從位置 i 向右跳 1~k 個距離。好比,arr[2] == 3, 表明從位置 2 能夠跳到位置三、位置4或位置5。若是從位置 0 出現,返回最少跳幾回能跳到 arr 最後的位置上。spa

舉例code

  arr=[3, 2, 3, 1, 1, 4]。blog

  arr[0] = 3, 選擇跳到位置 2; arr[2] = 3, 能夠跳到最後的位置,因此返回 2。class

要求變量

  若是 arr 的長度爲 N, 要求實現時間複雜度爲 O(N), 額外空間複雜度爲 O(1)。遍歷

難度方法

  一星next

【解答】static

  1. 整型變量 jump, 表明目前走了多少步,初始值爲 1;整型變量 cur, 表明在能走 jump 步的狀況下,能夠到達的最遠位置,初始值爲 arr[0];整型變量 next, 表明若是多走一步,能夠達到的最遠位置,初始值爲 arr[0]。
  2. 從左到右遍歷 arr, 假設遍歷到位置 i:
  • 若是 cur >= i, 說明跳 jump 步能夠到達位置 i, 此時什麼都不作。當 cur >= arr.length-1 時, 可直接返回 jump.
  • 若是 cur < i, 說明跳 jump 步不能夠達到位置 i, 此時要先多跳一步,令 jump++, cur = next. 

    3. next 表明着位置 i 前面的位置多跳一步能夠到達的最遠位置, i + arr[i] 表明着從位置 i 多跳一步能夠到達的位置,二者之間的最大值  Math.max(next, i+arr[i]) 即爲達到位置 i 或 位置 i 以前的位置多跳一步能夠達到的最遠位置, 賦值給 next.

  具體代碼實現請參考以下代碼中的 jump 方法:

 1 public class Main {  2     
 3     public static void main(String[] args) {  4         int[] arr = {3,2,3,1,1,4};  5         System.out.println(new Main().jump(arr));  6  }  7     
 8     public int jump(int[] arr){  9         if(arr == null || arr.length < 2) return 0; 10         int jump = 0; //表示跳躍步數
11         int cur = 0; //表示跳躍 jump 步, 即當前能夠到達的最遠位置
12         int next = 0; //表示多跳躍一步, 能夠到達的最遠位置
13         
14         for(int i = 0, len = arr.length; i < len; i++){ 15             if(cur < i){//若當前不能達到位置 i, 則須要多跳一步, 並使 cur 指向多跳一步能達到的最遠位置
16                 jump++; 17                 cur = next; 18                 if(cur >= len - 1){ 19                     return jump; 20  } 21  } 22             next = Math.max(next, i + arr[i]); 23  } 24         
25         return jump; 26  } 27     
28 }
相關文章
相關標籤/搜索