1. 题目
https://leetcode.cn/problems/jump-game/
考察点
这道题的考察点是数组和动态规划。
数组是一种基本的数据结构,需要掌握如何遍历、访问和修改数组中的元素。
动态规划是一种常用的算法思想,需要掌握如何找到问题的最优子结构、状态转移方程和边界条件。
这道题可以用动态规划来解决,也可以用贪心算法来优化时间复杂度。
2. 解法
思路
这个问题的思路是从后往前遍历数组,
- 维护一个变量lastIndex表示能够到达最后一个位置的最小索引。
- 如果当前位置i加上nums[i]大于等于lastIndex,
- 说明从i位置可以跳到lastIndex,那么更新lastIndex为i。
- 最后判断lastIndex是否为0,如果是,说明可以从第一个位置跳到最后一个位置,返回true;否则返回false。
具体实现
这个解法属于贪心算法,因为它每次选择能够跳到最远的位置,而不考虑其他的可能性。贪心算法的优点是简单高效,缺点是不一定能得到全局最优解,需要证明贪心策略的正确性。
class Solution { public boolean canJump(int[] nums) { int lastIndex = nums.length - 1; // 最后一个位置 for (int i = nums.length - 2; i >= 0; i--) { // 从后往前遍历 if (i + nums[i] >= lastIndex) { // 如果当前位置可以跳到lastIndex lastIndex = i; // 更新lastIndex为当前位置 } } return lastIndex == 0; // 判断是否可以从第一个位置跳到最后一个位置 } }
另一种写法
public class JumpGame { public boolean canJump(int[] nums) { int maxLength = 0; for (int i = 0; i < nums.length ; i++) { if (maxLength >= nums.length - 1) { return true; } if (maxLength < i) { return false; } maxLength = Math.max(nums[i] + i, maxLength); } return false; } }