力扣-贪心-45 跳跃游戏
思路
利用上一题思路先判断每一个点是否可以到达终点,构建bool数组,然后从0开始更新当前可以到达的最大值,更新这个最大值,知道这个最大值大于下标范围即可,每更新一次相当于跳跃一次,需要注意的是更新条件
- 从当前点可以跳到的最大范围往前剋是遍历
- 该点满足可以跳到重点
- 当前的比记录跳的范围更远
- 记录的还没跳到终点(因为当前记录已经可以跳到重点,就不需要更新了,直接跳到终点就可以)
代码
class Solution {
public:
bool canJump(int index, vector<int> &nums){
int cover = index;
if(index == nums.size() - 1) return true;
for(int i = index; i <= cover;i++){
cover = max(cover, i + nums[i]);
if(cover >= nums.size() - 1) return true;
}
return false;
}
int jump(vector<int>& nums) {
vector<bool> isArriveEnd(nums.size(), false);
for(int i = 0; i < nums.size(); i++){
isArriveEnd[i] = canJump(i, nums);
}
int res = 0, cur = 0;
for (cur = 0; cur < nums.size() - 1;) {
int cover = cur + nums[cur];
int curMaxAndArrive = cover;
int length = nums.size() - 1;
for (int j = cover; j > cur && j < nums.size(); j--) {
if (isArriveEnd[j] && j + nums[j] > curMaxAndArrive + nums[curMaxAndArrive]
&& curMaxAndArrive + nums[curMaxAndArrive] < length) {
curMaxAndArrive = j;
}
}
res++;
cur = curMaxAndArrive;
}
return res;
}
};