題目
給定一個非負整數數組,你最初位于數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最后一個位置。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最后一個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳 1 步,然后跳 3 步到達數組的最后一個位置。
說明:
假設你總是可以到達數組的最后一個位置。
思考
下面看我的思路草圖:
每次需要更新的參數:當前遍歷的start、end,當前遍歷范圍中找到的最大的下一步的end。
迭代結束條件:end < nums.size()-1;
按照這個思路很快可以寫出來代碼:
class Solution {
public:int jump(vector<int>& nums) { int start = 0;int end = 0;int step = 0;//只有end >= nums.size()-1,才退出whilewhile(end < nums.size()-1){//找到當前覆蓋范圍能到達的最遠距離int max_distance = 0;for(int i = start;i <= end;i++){max_distance = max(nums[i]+i,max_distance);}//利用最遠距離更新end和startstart = end + 1;end = max_distance;//步數加一step += 1;}return step;}
};
總結
貪心思想:每次記錄你能夠跳到的最遠距離 max_distance !!!
下一次尋找的范圍從上一次范圍的end后面一個開始,到最遠距離結束。
start = end + 1;
end = max_distance;