文章目录
- [一. 力扣 [45. 跳跃游戏 II](https://leetcode.cn/problems/jump-game-ii/description/)](#一. 力扣 45. 跳跃游戏 II)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [二. 力扣 [55. 跳跃游戏](https://leetcode.cn/problems/jump-game/description/)](#二. 力扣 55. 跳跃游戏)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
一. 力扣 45. 跳跃游戏 II
1. 题目解析
题目中最重要的一句话是, 从nums[i]位置, 可以跳到区间[i, i + j]的任意位置
2. 算法原理
贪心算法 + 双指针 + 层序遍历
动态规划
3. 代码
贪心算法代码👇
java
class Solution {
public int jump(int[] nums) {
int left = 0, right = 0, n = nums.length;
if (n == 1) {
return 0;
}
int ret = 1;
while (true) {
int max = 0;
while (left <= right) {
max = Math.max(nums[left] + left, max);
left++;
}
if (max >= n - 1) {
return ret;
}
right = max;
ret++;
}
}
}
动态规划代码👇
java
class Solution {
public int jump(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
for (int i = 1; i < n; i++) dp[i] = 0x3f3f3f3f;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] + j >= i) {
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
return dp[n - 1];
}
}
二. 力扣 55. 跳跃游戏
1. 题目解析
这道题和 跳跃游戏II 十分相似, 只是条件换了换, 有可能不能走到n - 1的位置
2. 算法原理
3. 代码
java
class Solution {
public boolean canJump(int[] nums) {
int n = nums.length, left = 0, right = 0, maxPos = 0;
while (left <= right) {
if (maxPos >= n - 1) {
return true;
}
for (int i = left; i <= right; i++) {
maxPos = Math.max(nums[i] + i, maxPos);
}
left = right + 1;
right = maxPos;
}
return false;
}
}




