###### 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;
}
};
```