LeetCode系列之【45. 跳跃游戏 II】C++ 每天一道leetcode!

目录(快速导航)

题目描述

视频讲解 https://www.bilibili.com/video/av66851964/

思路

代码


题目描述:

题目链接:https://leetcode-cn.com/problems/jump-game-ii/submissions/

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

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

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

示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

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

视频讲解

https://www.bilibili.com/video/av66851964/


思路:

贪心:

从局部最优,达到全局最优。

每一次跳步,选择利益最大的,也就是跳最远的。怎么算最远,也就是:

注意:

下图中,每次都需要加上目标跳+可跳:

如:第一次中比较如下: 3+1,1+2,选择3+1;

第二次比较中:1+1,2+2,4+3,选择4+3;

切记不要忘记可跳数。

LeetCode系列之【45. 跳跃游戏 II】C++ 每天一道leetcode!_第1张图片


代码:

class Solution {
public:
    int jump(vector& nums) {
        if (nums.size() == 1) return 0;
        int i = 0,step=0;
        while (i < nums.size()) {
            int max_num = 0,start= i, end= i + nums[i];
            // 避免漏 最后一次跳步
            step++;
            // 调到尾部 跳出
            if (end + 1 >= nums.size()) break;
            // 贪心 每次选择 目标跳+可跳 最大的
            for (int j = start + 1; j <= end; j++) {
                if (max_num < (nums[j] + j - start)) {
                    i = j;
                    max_num = nums[j] +j - start;
                };
            }
        }
        return step;
    }
};

一起加油!!刷题!!

你可能感兴趣的:(leetcode)