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

leetcode:面试题 08.01. 三步问题

题目链接

        面试题 08.01. 三步问题 - 力扣(LeetCode)

题目描述

解法一:

int waysToStep(int n) {// dp[i]--->爬到第i阶楼梯的最大方式// dp[i] = dp[i-1] + dp[i-2] + dp[i-3];if(n == 1) return 1;if(n == 2) return 2;if(n == 3) return 4;vector<int> dp(n+1);dp[1] = 1;dp[2] = 2;dp[3] = 4;// dp[4] = 7; dp[5] = dp[4] + dp[3] + dp[2] = 13;for(int i = 4; i <= n; i++){dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;}return dp[n];
}

解法二:

// dp[i][1]--->从上一个台阶进入此台阶,爬楼梯的最大方式
// dp[i][2]--->从上二个台阶进入此台阶,爬楼梯的最大方式
// dp[i][3]--->从上三个台阶进入此台阶,爬楼梯的最大方式int waysToStep(int n) {if(n == 1) return 1;if(n == 2) return 2;if(n == 3) return 4;vector<vector<int>> dp(n+1,vector<int>(4));dp[1][1] = 1; dp[1][2] = 0; dp[1][3] = 0;dp[2][1] = 1; dp[2][2] = 1; dp[2][3] = 0;dp[3][1] = 2; dp[3][2] = 1; dp[3][3] = 1;for(int i = 4; i <= n; i++){dp[i][1] = ((dp[i-1][1] + dp[i-1][2]) % MOD + dp[i-1][3]) % MOD;dp[i][2] = ((dp[i-2][1] + dp[i-2][2]) % MOD + dp[i-2][3]) % MOD;dp[i][3] = ((dp[i-3][1] + dp[i-3][2]) % MOD + dp[i-3][3]) % MOD;}return ((dp[n][1] + dp[n][2]) % MOD + dp[n][3]) % MOD;}

解法分析

  1. 解法1与解法2比较之下,肯定是解法1更加合适,方便
  2. 两种解法都是采用动态规划思想去解决问题,也就是说采用动态规划方法去解决问题时,不止一种思考方式
  3. 动态规划法去解决问题时,宏观逻辑是,利用计算机的记忆,把每种情况都记住,然后一步步迭代,这次迭代的过程,依赖上次迭代的结果,上次迭代的结果被计算机存储了。
  4. 可以说动态规划是在一步步的暴力穷举,只有走了第一步,才能走好第二步。只有走了第二步,才能走好第三步
  5. 动态规划在记什么:在记状态,你决定如何考虑状态,就决定你要怎么走
  6. 最好怎么考虑状态:状态最少的状态,就是解决问题最好的状态

解法三:递归法

//方法三:但是测试99时已经超出时间显示int dfs(int n){if(n == 1) return 1;if(n == 2) return 2;if(n == 3) return 4;int n1 = dfs(n-1);int n2 = dfs(n-2);int n3 = dfs(n-3);return n1 + n2 + n3;}int waysToStep(int n) {return dfs(n);}

解法分析

  1. 纯递归也可以解决问题,仅仅只是数据量太大时,超过时间限制而已
  2. 也就是说,动态规划是解决该问题的一个方法,也可以用其它方法来解决问题
  3. 也就是说这道题不是动态规划本身,动态规划算法是解决这道题的一个方法
  4. 也就是说这道题,利用了计算机的存储结构,这是计算机对动态规划算法做出的贡献
  5. 人脑决定了计算机存储什么,这是人脑对动态规划算法做出的贡献
  6. 人脑根据如何分类状态,决定如何计算机如何存储数据
  7. 也就是说动态规划算法== 人脑根据智力分类状态 + 计算机存储状态 + 计算机迭代
http://www.lryc.cn/news/573689.html

相关文章:

  • Linux 无线网络驱动开发 之 子系统源码框架(nl80211、cfg80211、mac80211)
  • 【weaviate】分布式数据写入之LSM树深度解析:读写放大的权衡
  • 计算机网络通信技术与协议(九)————交换机技术
  • flink如何支持kafka容灾自动切换
  • C++,Qt事件处理机制编程开发练习全解析,23000字解析!!
  • 二、Generative adversarial network (GAN)
  • 深入理解Spring MVC:构建灵活Web应用的基石
  • Elasticsearch Kibana (一)
  • React纯函数和hooks原理
  • 开发语言本身只是提供了一种解决问题的工具
  • Qt应用中处理Linux信号:实现安全退出的技术指南
  • 对射式红外传感器计次旋转编码器计次
  • 消息队列:基本知识
  • day039-nginx配置补充
  • VSCode性能调优:从卡顿到丝滑的终极方案
  • React 核心原理与Fiber架构
  • java中关于异步转同步的一些解决方案的对比与思考。【spring mvc堵塞式】
  • 【前后前】导入Excel文件闭环模型:Vue3前端上传Excel文件,【Java后端接收、解析、返回数据】,Vue3前端接收展示数据
  • 华为云Flexus+DeepSeek征文|在Dify-LLM平台中开发童话故事精灵工作流AI Agent
  • 【DDD】——带你领略领域驱动设计的独特魅力
  • C4.5算法深度解析:决策树进化的里程碑
  • 《HTTP权威指南》 第7章 缓存
  • mysql join的原理及过程
  • C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • 如何处理RocketMQ的各种线上问题
  • 【Python学习笔记】报错:Unindent amount does not match previous indent
  • Spring Boot 项目初始化
  • AWS 使用图形化界面创建 EKS 集群(零基础教程)
  • LabVIEW图像拼接原理与实现 链接附件有演示录像