码迷,mamicode.com
首页 > Web开发 > 详细

PluckyMagnet

时间:2019-10-09 19:25:22      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:next   etc   tco   nbsp   第一个   int   目标   max   难度   

问题描述

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

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

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


示例

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

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


分析

难度:3.5(因为涉及到时间优化的问题)

在两年前就有写过这个问题,比较容易想出的就是从后到前的动态规划,但是对于时间要求比较高的OJ,如果不对DP方法加以优化,是绝对会超时的。并且在跳跃游戏二中提出的优化方法有一点问题,如果非要对DP进行优化的,我能想到的是建立线段树,来缩小计算区间最小值的时间。

但是其实使用贪心算法,可以在O(n)内完成所求:

具体思路就是,每次都选择可跳范围内能跳最远的那一步,不断更新能跳的最远范围。


参考代码

//leetcode:https://leetcode-cn.com/problems/jump-game-ii/
class Solution {
public:
    int jump(vector<int>& nums) {
        int len = nums.size();
        if (len <= 1) return 0;
        int next = nums[0],now = 0;
        int step = 0;
        for (int i = 0; i < len; i++) {
            next = max(next , i + nums[i]);
            if (next >= len - 1){
                return ++step;
            }
            //跳跃,这里可以看做并不是跳至next了,而是跳至上次位置到next之间的任意位置
            if(i == now){
                now = next;
                step++;
            }
        }
        return step;
    }
};

原文:大专栏  PluckyMagnet


PluckyMagnet

标签:next   etc   tco   nbsp   第一个   int   目标   max   难度   

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11643532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!