坚持是人类伟大的品质
目录
一、爬楼题问题
1、题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
提示:
1 <= n <= 45
2、思路:
具体想法:
首先如果楼梯有一层,那方法就只有一种
如果楼梯有两层,那么方法有两种
.............................................................
如果楼梯有n层,往下细分,其实有两种方法,从n-1层走一步上来,或者从n-2层走两步上来的,
所以我们把问题看成到达第 n-2 阶时所有方式加上到达第n-1阶时所有方式就是到达第n阶的所有方式。那到n-1层又有两种方法,到n-2层又有两种方法.....
如果f(1)=1,f(2)=2,f(3)=3,f(4)=5......f(n)=f(n-1)+f(n-2)
斐波那契数列:
1,1,2,3,5,8,13...这样一个数列就是斐波那契数列,求第n项的值。
观察数列可得,除了第一项和第二项,所有的数列的值都是前一项和前一项的前一项的加和,转换成函数也就是f(n) = f(n-1) + f(n-2)
有兴趣的可以看看数列的三种求法:
3、代码:
第一次写出来的代码是
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return n
if n>2:
n=climbStairs(n-1)+climbStairs(n-2)
return n
出现了错误,查询之后,应该是self参数出了错误:(可以看看这个文章)
在leetcode中,为什么会出现错误“NameError:未定义全局名称‘爬楼梯’”?但是在没有“自我”和“客体”的情况下工作? - 问答 - Python中文网
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return n
if n>2:
return self.climbStairs(n-1)+self.climbStairs(n-2)
在提交的时候,发现这个代码运行时间过长,我们可以采用另一种方法,不调用:
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1 :
return 1
if n == 2 :
return 2
step1 = 1
step2 = 2
for i in range(3,n+1):
now = step1 + step2
step1 = step2
step2 = now
return now