给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
思路:
初始的想法就是定义
d
p
[
i
]
dp[i]
dp[i]代表到第
i
i
i个位置的最小时间。这样的话转移就得使用线段树来维护,复杂度
O
(
n
∗
l
o
g
(
n
)
)
O(n*log(n))
O(n∗log(n))。
d p [ i ] dp[i] dp[i]是递增的,所以我们只需要维护当前所在点的最短距离 d d d,和最短距离 d d d的边界,最短距离为 d + 1 d+1 d+1的边界。
当达到最短距离 d d d的边界时,边界变成 d + 1 d+1 d+1的边界,同时 d = d + 1 d=d+1 d=d+1,这就做到了 O ( n ) O(n) O(n)。
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
int now = 0; //当前距离
int pos = 0; //最大边界
int nex = 0; //下一次的最大边界
for(int i = 0;i < n;i++) {
nex = max(nex,nums[i] + i);
if(i == pos && i != n - 1) {
now++;
pos = nex;
}
}
return now;
}
};