貪心算法問題-LeetCode 55、45(貪心算法,跳躍問題)

  • 2019 年 10 月 8 日
  • 筆記

貪心算法問題:LeetCode #55 #45

1

編程題

【LeetCode #55】跳躍遊戲

給定一個非負整數數組,你最初位於數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最後一個位置。

示例 1:

輸入: [2,3,1,1,4] 輸出: true 解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。 示例 2: 輸入: [3,2,1,0,4] 輸出: false 解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位> > 置。

算法原理: 遍歷整個nums數組,每次計算從i位置的最大可能到達的距離,然後依次更新這個最大值,如果最大值大於nums的大小nums.size(),那麼就返回true, 否則返回false.

其中i的範圍是:小於nums.size()同時還要小於從當前位置i可以到達的距離。這就是正常人取求解這個問題的思路,很容易想到的!

C++代碼:

class Solution {  public:      bool canJump(vector<int>& nums) {          int maxReach = ;          for(int i =  ;i < nums.size() && i <= maxReach; i++){              maxReach = max(maxReach, i+nums[i]);          }          if(maxReach < nums.size()-1){              return false;          }          return true;      }  };  

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/jump-game

【LeetCode #45】跳躍遊戲II

給定一個非負整數數組,你最初位於數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。

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

示例:

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

假設你總是可以到達數組的最後一個位置

算法原理: 由於題目中規定總能到達數組的最後一個位置,因此我們在遍曆數組時每次都要去找最大的跳躍位置,只有到達了這個最遠的邊界end,我們才讓step進行自加,同時更新最遠的邊界end為最遠可以跳躍的位置。

如下圖,開始的位置是 2,可跳的範圍是橙色的。然後因為 3 可以跳的更遠,所以跳到 3 的位置。

如下圖,然後現在的位置就是 3 了,能跳的範圍是橙色的,然後因為 4 可以跳的更遠,所以下次跳到 4 的位置。

class Solution {  public:      int jump(vector<int>& nums) {          int end = ;          int maxReach = ;          int step = ;          for(int i = ;i < nums.size()-1;i++){              maxReach = max(maxReach, nums[i] + i);              if(i == end){                  end = maxReach;                  step++;              }          }          return step;      }  };  

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/jump-game-ii