跳跃游戏 II
力扣官方题解发布于 1 天前4.8k官方C++GoJavaPython3贪心算法
先找 当前位置+当前位置步数 > 数组元素个数
解题思路
这道题是典型的贪心算法,通过局部最优解得到全局最优解。以下两种方法都是使用贪心算法实现,只是贪心的策略不同。
方法一:反向查找出发位置
我们的目标是到达数组的最后一个位置,因此我们可以考虑最后一步跳跃前所在的位置,该位置通过跳跃能够到达最后一个位置。
如何有多个位置通过跳跃都能够到达最后一个位置,那么我们应该如何进行选择呢?直观上来看,我们可以「贪心」地选择距离最后一个位置最远的那个位置,也就是对应下标最小的那个位置。因此,我们可以从左到右遍历数组,选择第一个满足要求的位置。
找到最后一步跳跃前所在的位置之后,我们继续贪心地寻找倒数第二步跳跃前所在的位置,以此类推,直到找到数组的开始位置。
使用这种方法编写的 C++
和 Python
代码会超出时间限制,因此我们只给出 Java
代码。
- Java
- Golang
class Solution {
public int jump(int[] nums) {
int position = nums.length - 1;
int steps = 0;
while (position > 0) {
for (int i = 0; i < position; i++) {
if (i + nums[i] >= position) {
position = i;
steps++;
break;
}
}
}
return steps;
}
}
复杂度分析
-
时间复杂度:O(n^2)O(n2),其中 nn 是数组长度。有两层嵌套循环,在最坏的情况下,例如数组中的所有元素都是 11,
position
需要遍历数组中的每个位置,对于position
的每个值都有一次循环。 -
空间复杂度:O(1)O(1)。