這道題刷代碼隨想錄的時候也刷過,本來以為有了上一題55.跳躍游戲的基礎,這道題會好做一點,但是依舊想不出來思路,回去看了下自己當時寫的博客,沒想到今天的感受和當時的感受都一模一樣。。。What can I say?看了下代碼隨想錄的視頻和靈神的題解,終于把這個問題徹底弄清楚了。
由于這道題保證一定能跳到終點,所以我們只需要考慮如何花最少的次數跳到終點,這里我們定義result
,current
和next
三個變量,result
用于記錄最小跳躍次數,current
代表本次跳躍后所能達到的覆蓋范圍的最遠邊界,next
代表下一次跳躍所能達到的最遠覆蓋范圍,然后用一個for
循環來遍歷nums
的元素,當我們遍歷到current
處,則說明我們已經達到了當前覆蓋范圍的邊界,我們需要先判斷是否已經到達數組的邊界,如果還沒到達,則當前是已經到達覆蓋范圍邊界但是尚未達到數組的邊界。我們必須跳躍一次,并將current
移動到下一次跳躍后的覆蓋范圍的邊界,即current = next;
,result++;
;當進入下一輪for
循環時,則i
進入下次跳躍的覆蓋范圍,我們再不斷地更新下下次跳躍的最遠覆蓋范圍,即next = max(next, i + nums[i]);
。如果i
已經到達了數組邊界,則無需進行下一次跳躍,直接退出循環即可。
class Solution {
public:int jump(vector<int>& nums) {int current = 0; //記錄當前所在的位置int result = 0; //記錄最小次數int next = 0;for(int i = 0; i < nums.size(); i++){next = max(next, i + nums[i]); //更新最大覆蓋范圍if(i == current){ //已經到達覆蓋范圍邊界,需要進行一次跳躍,直接跳到下一個最大覆蓋范圍的邊界if(i != nums.size() - 1){ //已經到達覆蓋范圍邊界但是尚未達到數組的邊界result++;current = next;}}}return result;}
};