当前位置: 首页 > news >正文

Leetcode45. 跳跃游戏 II

Every day a Leetcode

题目来源:45. 跳跃游戏 II

解法1:动态规划 + 贪心

定义 dp[i] 表示到达 i 的最少跳数。

因为题目保证能跳动终点,只要前面的点(j < i)能跳到 i 点就更新最小值。

代码:

class Solution
{
public:int jump(vector<int> &nums){int n = nums.size();// dp[i] 表示到达 i 的最少跳数vector<int> dp(n, INT_MAX);// 初始化dp[0] = 0;// 状态转移for (int i = 1; i < n; i++){for (int j = 0; j < i; j++)if (j + nums[j] >= i)dp[i] = min(dp[i], dp[j] + 1);}return dp[n - 1];}
};

优化:找到第一个能跳到 i 的点 last,使用点 last 更新 dp[i]。

// 动态规划class Solution
{
public:int jump(vector<int> &nums){int n = nums.size();// dp[i] 表示到达 i 的最少跳数vector<int> dp(n, INT_MAX);// 初始化dp[0] = 0;// 状态转移for (int i = 1, last = 0; i < n; i++){// 找到第一个能跳到 i 的点 lastwhile (last < n && last + nums[last] < i)last++;// 使用点 last 更新 dp[i]dp[i] = min(dp[i], dp[last] + 1);}return dp[n - 1];}
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。

解法2:贪心

正向查找可到达的最大位置。

代码:

class Solution
{
public:int jump(vector<int> &nums){int max_far = 0; // 目前能跳到的最远位置int step = 0;    // 跳跃次数int end = 0;     // 上次跳跃可达范围右边界(下次的最右起跳点)for (int i = 0; i < nums.size() - 1; i++){max_far = max(max_far, i + nums[i]);// 到达上次跳跃能到达的右边界了if (i == end){end = max_far; // 目前能跳到的最远位置变成了下次的最右起跳点step++;        // 进入下一次跳跃}}return step;}
};

反向查找出发位置。

代码:

class Solution
{
public:int jump(vector<int> &nums){int max_far = 0; // 目前能跳到的最远位置int step = 0;    // 跳跃次数int end = 0;     // 上次跳跃可达范围右边界(下次的最右起跳点)for (int i = 0; i < nums.size() - 1; i++){max_far = max(max_far, i + nums[i]);// 到达上次跳跃能到达的右边界了if (i == end){end = max_far; // 目前能跳到的最远位置变成了下次的最右起跳点step++;        // 进入下一次跳跃}}return step;}
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。


http://www.mrgr.cn/news/40442.html

相关文章:

  • 关于计算机算法设计方法的思考
  • 监控易监测对象及指标之:Exchange邮件服务器监测
  • 死锁相关概念
  • 足球青训后台管理系统:Spring Boot实现指南
  • VMware Aria Automation Orchestrator 8.18 发布,新增功能概览
  • 动态规划最低票价
  • 【卡尔曼滤波】 Kalman Filter 原理详解与公式推导
  • 解决银河麒麟中`/etc/sudoers`权限问题
  • 《如何高效学习》
  • 面试金典题3.2
  • # VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?
  • 713. 乘积小于 K 的子数组 滑动窗口
  • docker安装kafka-manager
  • 【分布式微服务云原生】OpenFeign:微服务通信的瑞士军刀
  • java 从基础到入门 到架构师所需要学习的路线
  • 掌握马丁格尔交易策略:Anzo Capital昂首资本教你盈利的6大原则
  • CentOS 7 系统中安装与配置 Telnet 服务详解(使用非root用户登录)
  • 基于SSM的农产品仓库管理系统【附源码】
  • 解决方案:机器学习中,回归及分类常用的模型评估指标有哪些
  • 深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制