每天学习一点算法 2026/03/30
题目:跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
我们设 dp[i] 表示当经过当前这个位置最多能走多少
那么以 dp[i] 其实就是 dp[i - 1] - 1 (因为 dp[i] 本身就领先一步)和 nums[i] 中的较大的值
以 nums = [2, 3, 1, 1, 4] 为例
dp[0] = num[0] = 2
dp[1] = Math.max(dp[0] - 1, num[1]) = 3
dp[2] = Math.max(dp[1] - 1, num[2]) = 2
dp[3] = Math.max(dp[2] - 1, num[3]) = 1
dp[4] = Math.max(dp[3] - 1, num[4]) = 4 (这一步可以不做)
只要 dp[i] 都是大于 0 的就一定能走到最后一个下标处
typescript
function canJump(nums: number[]): boolean {
if (nums.length === 1) return true
let preDp = 0 // 记录上一个位置的 dp 初始为 0
for (let i = 0; i < nums.length - 1; i++) {
preDp = Math.max(preDp - 1, nums[i]) // 计算当前dp
if (preDp === 0) return false // 无法继续前进
if (i + preDp >= nums.length - 1) return true // 当前位置 + 最大前进步数超过最后下标就不用继续计算了
}
};
题目来源:力扣(LeetCode)