题目描述:

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。
实现一种方法,计算小孩有多少种上楼梯的方式。
结果可能很大,你需要对结果模1000000007。示例1:输入:n = 3 输出:4说明: 有四种走法示例2:输入:n = 5输出:13提示:
n范围在[1, 1000000]之间

解决思路:

动态规划

参考文章:动态规划之青蛙跳台阶
动态规划基本思想

动态规划的实质是分治思想和解决冗余。因此,动态规划是一种将问题实例分解为更小的/相似的子问题,并存储子问题的解,使得每个子问题只求解一次,最终获得原问题的答案,以解决最优化问题的算法策略。

与贪心法的关系:
1.与贪心法类似,都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。
2.贪心法选择当前最优解,而动态规划通过求解局部子问题的最优解来达到全局最优解。

与递归法的关系:
1.与递归法类似,都是将问题实例归纳为更小的、相似的子问题。
2.递归法需要对子问题进行重复计算,需要耗费更多的时间与空间,而动态规划对每个子问题只求解一次。对递归法进行优化,可以使用记忆化搜索的方式。它与递归法一样,都是自顶向下的解决问题,动态规划是自底向上的解决问题。

递归问题——>重叠子问题——> 1.记忆化搜索(自顶向下的解决问题);2.动态规划(自底向上的解决问题)

Java代码:

递归,自顶向下,但是该方法会超时

class Solution {public int waysToStep(int n) {int mod = 1000000007;if(n<=2) return n;if(n==3) return 4;//递归return ((waysToStep(n-1)+waysToStep(n-2))%mod+waysToStep(n-3))%mod;}
}

回溯,自底向上

class Solution {public int waysToStep(int n) {int mod = 1000000007;//定义初始数组int[] d = new int[]{1,2,4};//定义中间变量int temp1 = 0;int temp2 = 0;//回溯(动态规划)if(n<=2) return n;if(n==3) return 4;if(n>3) {for (int i = 4; i <= n ; i++) {//i++之后,现在的d[1]变成d[0],现在的d[2]变成d[1],新产生的d[2]是d[2]temp1 = d[1];temp2 = d[2];//d[2]=d[0]+d[1]+d[2];//不要忘记取余,否则数据会溢出d[2]=( (d[0]+d[1])%mod+d[2] )%mod;//更新d[0]和d[1]d[0] = temp1;d[1] = temp2;}}return d[2];}
}

LeetCode——面试题 08.01. 三步问题相关推荐

  1. Leetcode 面试题 08.01. 三步问题

    Leetcode 面试题 08.01. 三步问题 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/three-steps ...

  2. LeetCode 面试题 08.01. 三步问题 (动态规划)

    面试题 08.01. 三步问题 解法1(动态规划) 分析出递推式:f(n) = f(n - 1) + f(n - 2) + f(n - 3) class Solution {public int wa ...

  3. Leetcode面试题 10.01. 合并排序的数组(C语言)

    Leetcode面试题 10.01. 合并排序的数组(C语言) 题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 ...

  4. LeetCode 面试题 08.11. 硬币 多种解法 完全背包问题

    面试题 08.11. 硬币   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部 ...

  5. [Leetcode] 面试题 08.02. 迷路的机器人

    [面试题 08.02. 迷路的机器人]   设想有个机器人坐在一个网格的左上角,网格 r 行 c 列.机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物).设计一种算法,寻找机器人从左上角 ...

  6. leetcode面试题 10.01. 合并排序的数组

    直接排序 直接使用Java已有的方法进行排序,这一招-大意了! 这题简单,就是个基本的排序,后面难题,可能这只是一小步,内个时候直接用排序算法比较合适,这个不合适.. class Solution { ...

  7. LeetCode —— 面试题 08.12. 八皇后(Python)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

  8. 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)

    仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...

  9. 【LeetCode 面试题 08.05】递归乘法

    递归乘法 https://leetcode.cn/problems/recursive-mulitply-lcci/ 题目描述 递归乘法. 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘. ...

最新文章

  1. java——逻辑运算符与(和)或(|和||)
  2. 连接MySQL的10060错误:Can't connect to MySQL server on '*.*.*.*'(10060)
  3. java中的操作符(位操作符>>与>>>的区别)
  4. 基本程序单元Activity—Activity生命周期之数据传递小程序
  5. 这本书强烈推荐看看!
  6. elasticsearch 问题
  7. 网页素材大宝库:20套精美的清爽风格图标素材
  8. [收藏]数据库备份及恢复
  9. SOJ 4482 忽悠大神【最小生成树】
  10. 转载:子网掩码以及子网划分
  11. win10如何删除计算机用户,Win10系统如何删除账户?Win10系统删除账户的方法
  12. UI设计---化繁为简
  13. js校验 身份证号18位
  14. html链接屏蔽了,js屏蔽广告/屏蔽网站元素/屏蔽网站超链接
  15. 某班30名同学成绩c语言,.编程实现:求某班30个同学的所有成绩,并统计出其平均分,最高分和最低分。...
  16. Django 创建随机验证码
  17. 牛牛的闹钟--网易2019实习生招聘编程题
  18. html 图片左上角圆角,圆角
  19. 青云很忙 QingCloud Insight 2017开幕倒计时
  20. 联发科硕士工作4年待遇_重庆医科大学第三临床学院 2019年硕士研究生复试工作圆满结束...

热门文章

  1. 读书总结:周鸿祎,我的互联网方法论
  2. 10g中如何修改数据库字符集-2
  3. Google Earth的十个常用技巧应用
  4. dotnet程序优化心得(三)
  5. springboot controller 访问 404
  6. 当使用easyui时,jquery的设置disabled属性方法失效
  7. html 表单控制器,c# – html表单发布到mvc控制器
  8. python图像等比例压缩_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
  9. kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息
  10. ubuntu java 1.6 安装,ubuntu 中安装java jdk 1.6