leetcode 45. 跳跃游戏 II
题意#
给数组,初始在0号位置,可以跳
解法1#
暴力,复杂度是
int t[N];
int jump(vector<int> &nums)
{
int n = nums.size();
for (int i = 0; i < n; i++)
t[i] = 1e9;
t[0] = 0;
for (int i = 0; i < n; i++)
{
for (int j = min(i + 1, n - 1); j <= min(n - 1, i + nums[i]); j++)
{
t[j] = min(t[i] + 1, t[j]);
}
}
return t[n - 1];
}
解法2#
以
那么如果贪心的考虑每次跳两步最远的区域,那么第三步可选的区域就更大,
举例来说,第一步如果选跳到下标1,那么第二步可以选择的区域是下标
如果第一步选择跳到下标2,那么第二步可以选择的区域是于下标
重点:两步能到达的区域大小不同,第三步能到达的区域大小一定也不同
所以选择能使下下步有更多选择的下一步
所以代码实现时遍历一遍nums,不过要动态维护一个边界end
比如说刚开始这个边界就是2,因为最远能跳到下标2
接下来遍历1到2,发现现在能到达的最远下标maxPos是4
在遍历到end时,step++,并且将end=maxPos
再继续从原本的end+1遍历到新的end
int jump(vector<int> &nums)
{
int n = nums.size();
int maxPos = 0, end = 0, step = 0;
for (int i = 0; i < n - 1; i++)
{
maxPos = max(maxPos, i + nums[i]);
if (i == end)
{
end = maxPos;
step++;
}
}
return step;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话