标签: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
标签:next etc tco nbsp 第一个 int 目标 max 难度
原文地址:https://www.cnblogs.com/sanxiandoupi/p/11643532.html