跳跃游戏

45. 跳跃游戏 II

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置

示例

输入: [2,3,1,1,4]

输出: 2

说明:

假设你总是可以到达数组的最后一个位置

思路

如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。

例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。下标 0 可到达的位置中,下标 1 的值是 3,从下标 1 出发可以达到更远的位置,因此第一步到达下标 1。

从下标 1 出发,最远可到达下标 4。下标 1 可到达的位置中,下标 4 的值是 4 ,从下标 4 出发可以达到更远的位置,因此第二步到达下标 4。

fig1

代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int curr_max_idx=0;
        int next_max_idx=0;
        int step=0;
        int target=nums.size()-1;
        if(target==0) return 0;
        for (int i = 0; i <= curr_max_idx; ++i)
        {
            next_max_idx=max(next_max_idx,i+nums[i]);
            if(next_max_idx>=target) return step+1;
            if(i==curr_max_idx)
            {
                curr_max_idx=next_max_idx;
                ++step;
            }
        }
        return step;
    }
};
posted @ 2020-09-16 15:33  周颖  阅读(19)  评论(0)    收藏  举报