一、题目
二、代码实现
贪心算法:
思路:
从某个位置出发,我们只需要找到第一个标记为 GOOD 的坐标(由跳出循环的条件可得),也就是说找到最左边的那个坐标。如果我们用一个单独的变量来记录最左边的 GOOD 位置,我们就可以避免搜索整个数组,进而可以省略整个 memo 数组。
从右向左迭代,对于每个节点我们检查是否存在一步跳跃可以到达 GOOD 的位置(currPosition + nums[currPosition] >= leftmostGoodIndex)。如果可以到达,当前位置也标记为 GOOD ,同时,这个位置将成为新的最左边的 GOOD 位置,一直重复到数组的开头,如果第一个坐标标记为 GOOD 意味着可以从第一个位置跳到最后的位置。
public class Solution {
public boolean canJump(int[] nums) {
int lastPos = nums.length - 1;
for (int i = nums.length - 1; i >= 0; i--) {
if (i + nums[i] >= lastPos) {
lastPos = i;
}
}
return lastPos == 0;
}
}
执行结果:
时间复杂度:O(n)
空间复杂度:O(1)
三、收获
通常解决并理解一个动态规划问题需要以下 4 个步骤:
- 利用递归回溯解决问题
- 利用记忆表优化(自顶向下的动态规划)
- 移除递归的部分(自底向上的动态规划)
- 使用技巧减少时间和空间复杂度