Difficulty:Hard
Description
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
For example:
Given array A = [2,3,1,1,4]
The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)
Note:
You can assume that you can always reach the last index.
Solution
思路
参考Discuss中的 Single loop simple java solution。觉得最高票的BFS有点麻烦,还是这个看起来比较直接简单。
与 Jump Game 类似,reach
用来记录可以达到的最大索引号,minjump
是返回结果。这里新引入了一个变量end
,记录当前这一跳能到达的最大索引号(与reach
区分开来)。
例如[2,2,4,1,3]
,就有
第0跳 2
第1跳 2,4
第2跳 1,3
在第0跳的2
中,reach=2
,因为要进入第1跳了,所以end=reach=2
, end
记录第1跳最远能达到4
,minjump = 1
。
进入第1跳的2
中,reach=3
,因为接下来仍处于第1跳,所以end
不变。
进入第1跳的4
中,reach=6
,因为要进入第2跳了,故end=reach=6
,minjump=2
。
进入第3跳,如此类推。因为永远跳不到nums[6]
,故minjump
最后仍然为2。
代码
class Solution {
public:
int jump(vector<int>& nums) {
// reach记录能达到的最大索引号
// end记录当前这一跳能到达的最大索引号
int minjump = 0, reach = 0, i, end = 0, n = nums.size() - 1;
for (i = 0; i < n; ++i) {
reach = reach < i + nums[i] ? i + nums[i] : reach;
if (i == end) { // 要进入下一跳了,end记录下一跳能达到的最大索引号
++minjump;
end = reach;
}
}
return minjump;
}
};