【每日一題-leetcode】45.跳躍遊戲 ||

45.跳躍遊戲 ||

  1. 跳躍遊戲 II

難度困難547

給定一個非負整數數組,你最初位於數組的第一個位置。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達數組的最後一個位置。

示例:

輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
     從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。

從後往前查找-貪心

   /**反向查找出發位置
          跳躍遊戲 可以通過貪心算法來完成,可以從前往後 或者 從後往前,通過獲取局部最優解
          來解決全局最優解。
          從nums.length-1位置 查找之前的一個元素是否能到達,如果可以,遍歷數組 從0開始到這個位置。
          找出最大值,依序查找,每次選取最大的步數,也就是局部最優解,而最優解,就可以決定全局是一個最優解
          time : O(N^2) 當數組中都是相同的數字,需要查找N^2次
          space : O(1)
          break 跳出循環  continue 結束本次循環 繼續下次循環
        */
        public int jump(int[] nums) {
          if(nums == null || nums.length == 0){
              return -1;
          }
          int steps = 0;//需要跳躍的次數
          int position = nums.length-1;
          while(position > 0){
            for(int i=0;i<position;i++){
              if(nums[i]+i>=position){//可以到達
                position = i;
                steps++;
                break;
              }
            }
          }
          return steps;
        }

從前往後查找-貪心

/*
        剛纔從後往前推 對於特定的相同的數組,需要遍歷O(N^2)次 時間複雜度比較高。
        我們換一個思路 從前往後推。[2,3,1,1,4]
        steps>記錄次數  end>記錄當前步長可以走的界限。
        比如 從0 位置出發,end = 2 在0位置2步內找到最大值。最大爲3,調到3上
        在end=3位置查找最大值 發現可以跳出。因此結束。
        ps:此處 我們沒有跳躍到數組的末尾位置,因此當可以跳出的時候只會大於或等於。
        time : O(n) space :O(1)
    */
    public int jump(int[] nums) {
        if(nums == null || nums.length == 0){
            return -1;
        }
        int steps = 0;
        int end = 0;//當前可以跳躍的最大步長
        int maxLength = 0;
        for(int i= 0;i<nums.length-1;i++){
            maxLength = Math.max(maxLength,nums[i]+i);
            if(end == i){ //end == i 其實比較的就是在最大步長內 是否會有一個更大的步長 
                end = maxLength;
                steps++;
            }
        }
        return steps;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章