【贪心算法】(第九篇)

目录

跳跃游戏Ⅱ(medium)

题目解析

讲解算法原理

编写代码

跳跃游戏(medium)

题目解析

讲解算法原理

编写代码


跳跃游戏Ⅱ(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀个⻓度为 n 的0索引整数数组 nums 。初始位置为 nums0

每个元素 numsi 表⽰从索引 i 向前跳转的最⼤⻓度。换句话说,如果你在 numsi 处,你可以跳转到任意 numsi + j 处:

• 0 <= j <= numsi

• i + j < n

返回到达 numsn - 1 的最⼩跳跃次数。⽣成的测试⽤例可以到达 numsn - 1

⽰例1:

输⼊:nums=2,3,1,1,4

输出:2

解释:跳到最后⼀个位置的最⼩跳跃数是2。

从下标为0跳到下标为1的位置,跳1步,然后跳3步到达数组的最后⼀个位置。⽰例2:

输⼊:nums=2,3,0,1,4

输出:2

提⽰:

◦ 1 <= nums.length <= 10(4)

◦ 0 <= numsi <= 1000

◦ 题⽬保证可以到达 numsn-1

讲解算法原理

解法(动态规划+类似层序遍历):
动态规划:

a. 状态表⽰:

dpi 表⽰从 0 位置开始,到达 i 位置时候的最⼩跳跃次数

b. 状态转移⽅程:

对于 dpi ,我们遍历 0 ~ i - 1 区间(⽤指针 j 表⽰),只要能够从 j 位置跳到

i 位置( numsj + j >= i ),我们就⽤ dpj + 1 更新 dpi ⾥⾯的值,找到

所有情况下的最⼩值即可。

类似层序遍历的过程:

⽤类似层序遍历的过程,将第 i 次跳跃的「起始位置」和「结束位置」找出来,⽤这次跳跃的情况,更新出下⼀次跳跃的「起始位置」和「终⽌位置」。

这样「循环往复」,就能更新出到达 n - 1 位置的最⼩跳跃步数。

编写代码

c++算法代码:

cpp 复制代码
class Solution
{
public:
 int jump(vector<int>& nums) 
 {
 int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();
 while(left <= right) // 保险的写法,以防跳不到 n - 1 的位置
 {
 if(maxPos >= n - 1) // 先判断⼀下是否已经能跳到最后⼀个位置 {
 return ret;
 }
 // 遍历当成层,更新下⼀层的最右端点
 for(int i = left; i <= right; i++)
 {
 maxPos = max(maxPos, nums[i] + i);
 }
 left = right + 1;
 right = maxPos;
 ret++;
 }
 return -1; // 跳不到的情况
 }
};

java算法代码:

java 复制代码
class Solution
{
 public int jump(int[] nums) 
 {
 int left = 0, right = 0, ret = 0, maxPos = 0, n = nums.length;
 while(left <= right) // 以防跳不到 n - 1 的位置
 {
 if(maxPos >= n - 1) // 判断是否已经能跳到最后⼀个位置
 {
 return ret;
 }
 for(int i = left; i <= right; i++)
 {
 // 更新下⼀层的最右端点
 maxPos = Math.max(maxPos, nums[i] + i);
 }
 left = right + 1;
 right = maxPos;
 ret++;
 }
 return -1;
 }
}

跳跃游戏(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个⾮负整数数组 nums ,你最初位于数组的第⼀个下标。数组中的每个元素代表你在该位置可以跳跃的最⼤⻓度。

判断你是否能够到达最后⼀个下标,如果可以,返回 true ;否则,返回 false 。

⽰例1:

输⼊:nums=2,3,1,1,4

输出:true

解释:可以先跳1步,从下标0到达下标1,然后再从下标1跳3步到达最后⼀个下标。⽰例2:

输⼊:nums=3,2,1,0,4

输出:false

解释:⽆论怎样,总会到达下标为3的位置。但该下标的最⼤跳跃⻓度是0,所以永远不可能到达最后⼀个下标。

提⽰:

◦ 1 <= nums.length <= 10(4)

◦ 0 <= numsi <= 10(5)

讲解算法原理

解法:

和跳跃游戏II⼀样,仅需修改⼀下返回值即可。

编写代码

c++算法代码:

cpp 复制代码
class Solution
{
public:
 bool canJump(vector<int>& nums) 
 {
 int left = 0, right = 0, maxPos = 0, n = nums.size();
 while(left <= right)
 {
 if(maxPos >= n - 1)
 {
 return true;
 }
 for(int i = left; i <= right; i++)
 {
 maxPos = max(maxPos, nums[i] + i);
 }
 left = right + 1;
 right = maxPos;
 }
 return false;
 }
};

java算法代码:

java 复制代码
class Solution
{
 public boolean canJump(int[] nums) 
 {
 int left = 0, right = 0, maxPos = 0, n = nums.length;
 while(left <= right)
 {
 if(maxPos >= n - 1)
 {
 return true;
 }
 for(int i = left; i <= right; i++)
 {
 maxPos = Math.max(maxPos, nums[i] + i);
 }
 left = right + 1;
 right = maxPos;
 }
 return false;
 }
}
相关推荐
点燃大海3 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran3 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄3 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记3 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
无限码力4 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly4 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1234 小时前
SolidWorks草图转三维DWG技巧
算法
ABAP-張旺4 小时前
ABAP:Visual Studio Code官方插件安装教程
ide·vscode·编辑器
凡人叶枫4 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯4 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷