题目链接:https://leetcode.com/problems/jump-game-ii/description/
简单贪心:用
Ri
标记第
i
步能到达的最右边位置.
首先,
事实上假设
Ri
上一步是
x
,则
那么
x≤Ri−1
,并且
x
可以到达
故第
i
步可以到达
其次,我们说
Ri+1
可以由
Ri−1+1
到
Ri
产生,
因为若不是,假设
Ri+1
由
x
产生,并且
取所有的区间划分
(−1,R0],(R0,R1]...(Ri−1,Ri]
,
x
必属于其一,不妨设
那么第
j+1≤i
步就可以到达
Ri+1
,矛盾.
因此我们有
R−1=−1,R0=0;
Ri+1=maxRi−1<k≤Ri(k+disk);
时间复杂度 O(n) ,空间复杂度 O(1)
class Solution {
public:
//right是走了i步到达的最右边,right_pre是i-1步, right_next是i+1步
int jump(vector<int>& nums) {
int n = nums.size();
if (n == 1)return 0;
int right = 0, right_pre = -1;
int right_next = 0;
for (int i = 1; i < n; ++i) {
for (int j = right_pre + 1; j <= right; ++j)
right_next = max(right_next, j + nums[j]);
if (right_next >= n - 1)return i;
right_pre = right;
right = right_next;
}
}
};