【前言】
python刷leetcode题解答目录索引:https://blog.csdn.net/weixin_40449300/article/details/89470836
github链接:https://github.com/Teingi/test
【正文】
假设你正在爬楼梯。需要 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 阶
思路
基本的动态规划问题,对于第n级台阶来说,有2种方法,1是到第n-1级,然后爬一个台阶;2是到第n-2个台阶,然后爬2个台阶,可以得出动态规划递推式:
F(n)=F(n−1)+F(n−2)F(n)=F(n−1)+F(n−2)
n=1n=1的时候为1;n=2n=2的时候为2
代码一:递归(时间超过限制)
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n==1:
return 1
elif n==2:
return 2
else:
return self.climbStairs(n-1) + self.climbStairs(n-2)
但是我们将递归拆开来看就会发现一个巨大的问题,f(n) = f(n-1)+f(n-2),为了求一个f(n),我们要多次计算前面的数值,这样既浪费了内存,又浪费了计算能力,那有没有更简单的算法呢?答案是必然的.使用循环我们就可以避免这个问题.
代码二:
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n==1:
return 1
elif n==2:
return 2
else:
tmp = [1,2]
for i in range(2,n):
tmp.append(tmp[i-1] + tmp[i-2])
return tmp[-1]
java代码:动态规划思想
简洁的自底向上,只保留运算下一个所需要的数字,其余的不要,所以空间固定
class Solution {
public int climbStairs(int n) {
if(n<0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
int first=1;
int second=2;
int third=0;
for(int i=3;i<=n;i++){
third=first+second;
first=second;
second=third;
}
return third;
}
}