跳跃数组II
原题在这里:
基于能否到达的基础上,增加了最少次数的条件,且保证一定能够到达。
analyse:
mine——定义dp[i]表示到达下标i最少需要次数
那么,初始化有int_max(or 数组长度+1),dp[0]=0
状态转移:
将dp在num[i]范围j取min值(dp[i]+1,dp[i+j])
code:

class Solution { public: int jump(vector<int> &nums) { int l = nums.size(); vector<int> dp(l, 1e4 + 1); dp[0] = 0; for (int i = 0; i < l; ++i) for (int j = 1; i + j < l && j <= nums[i]; ++j) dp[i + j] = min(dp[i + j], dp[i] + 1); return dp[l - 1]; } };
这是很容易想到的处理算法,但是不够好,复杂为O(N*num[i])
进阶:
analyse:
对于状态num[i],在可达范围内[i,i+num[i]]的step次数一定相同,那么最终在上一个dp的遍历结果呈现阶梯形式
也就是,只需要维护当前step可以到达的区间范围即可,当到达当前step的max边界时候,step+1,更新max边界
注意一点是,实际遍历处理不需要遍历到数组最后一个下标
code:
class Solution { public: int jump(vector<int> &nums) { int n = nums.size(), ans = 0, x = 0, r = 0; for (int i = 0; i < n - 1; ++i) { x = max(x, i + nums[i]); if (i == r) r = x, ans++; } return ans; } };
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!