---
# System prepended metadata

title: 'LeetCode #45 [Jump Game II](https://leetcode.com/problems/jump-game-ii)'
tags: [LeetCode, Medium]

---

###### tags: `LeetCode` `Medium`
# LeetCode #45 [Jump Game II](https://leetcode.com/problems/jump-game-ii)
### (Medium)
給你一個非負整數數組 nums ，你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
假設你總是可以到達數組的最後一個位置。


---
設定start(每次檢查開始點), end(每次檢查結束點), maxend(每次檢查能達到最遠點), step(總步數)。

設一while迴圈while(end<nums.size()-1), 首先每次迴圈開始時先將step加一, 而由於題目前提說"總是可以達到數組的最後一個位置", 故可先將maxend設為end+1(最差也能多走一步)。

接下來執行本輪檢查, 由start檢查到end, 途中更新maxend為現在maxend與i+nums[i](也就是該點加上該點能跳躍的距離)中取較大值, 而在檢查途中若i+nums[i]≥nums.size()-1則代表在該點可以直接跳到終點, 此時直接回傳step。檢查結束後, maxend的值代表了在這輪(起始點start到結束點end)中可以達到的最大距離。於是開始新一輪的檢查, 此時start為舊的end+1, end為舊的maxend, maxend為新的end+1(也就是說檢查新一輪是否有某個點能超過舊的maxend, 而再不濟也是舊的maxend+1)。

如此持續直到end≥nums.size()-1, 然後回傳step值。


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