博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
力扣题解| 70. 爬楼梯
阅读量:2440 次
发布时间:2019-05-10

本文共 967 字,大约阅读时间需要 3 分钟。

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1.  1 阶 + 1 阶2.  2 阶

示例 2:

输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1.  1 阶 + 1 阶 + 1 阶2.  1 阶 + 2 阶3.  2 阶 + 1 阶

动态规划思路和算法

我们用 f(x)表示爬到第 x级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:

f(x)=f(x−1)+f(x−2)它意味着爬到第 x级台阶的方案数是爬到第 x−1级台阶的方案数和爬到第 x−2级台阶的方案数的和。

很好理解,因为每次只能爬 1级或 2 级,所以 f(x)只能从 f(x−1)和 f(x−2)转移过来,而这里要统计方案总数,
我们就需要对这两项的贡献求和。以上是动态规划的转移方程,下面我们来讨论边界条件。我们是从第 000 级开始爬的,
所以从第 0级爬到第 0级我们可以看作只有一种方案,即 f(0)=1;从第 0级到第 1级也只有一种方案,即爬一级,f(1)=1。
这两个作为边界条件就可以继续向后推导出第 n级的正确结果。我们不妨写几项来验证一下,根据转移方程得到 f(2)=2,
f(3)=3,f(4)=5...我们把这些情况都枚举出来,发现计算的结果是正确的。
我们不难通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n)的实现,但是由于这里的 f(x)只和
f(x−1)与 f(x−2)有关,所以我们可以用「滚动数组思想」把空间复杂度优化成 O(1)。下面的代码中给出的就是这种实现。

class Solution {    public int climbStairs(int n) {        int p = 0, q = 0, r = 1;        for (int i = 1; i <= n; ++i) {            p = q;             q = r;             r = p + q;        }        return r;    }}

 

转载地址:http://bbuqb.baihongyu.com/

你可能感兴趣的文章
MYSQL的master/slave数据同步配置(转)
查看>>
一个完整的ftp远程批量shell(转)
查看>>
Vsftpd匿名无法上传,配置如下,帮忙找下原因,谢谢~!(转)
查看>>
crontab命令简介(转)
查看>>
C++中的静态联编和动态联编介绍(转)
查看>>
带有农历的日历(QT版本1752-2100)(转)
查看>>
LINUX的系统内核空间的保护(转)
查看>>
在Visual C++中利用UDL文件建ADO连接(转)
查看>>
C++编程批评系列 继承的本质(转)
查看>>
unix下编写socket程序的一般步骤(转)
查看>>
共享软件中注册部分的简单实现(转)
查看>>
RedHat Linux 9下所有权和许可权限(转)
查看>>
C++程序设计从零开始之语句(转)
查看>>
利用Apache+PHP3+MySQL建立数据库驱动的动态网站(转)
查看>>
C#中实现DataGrid双向排序(转)
查看>>
利用C语言小程序来解决大问题(转)
查看>>
简单方法在C#中取得汉字的拼音的首字母(转)
查看>>
.NET开发之中的17种正则表达式小结(转)
查看>>
编程秘籍:使C语言高效的四大绝招(转)
查看>>
配置XDM--一种Linux的图形登录界面(转)
查看>>