上班摸鱼,试试算法题摸摸鱼,题目如下:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1 阶 + 1 阶
2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶
1 阶 + 2 阶
2 阶 + 1 阶
提示:
1 <= n <= 45
To reach nth step, what could have been your previous steps? (Think about the step sizes)
要到达第n步,你之前的步骤是什么?(想想步长)
很明显如果要求10阶楼梯的答案需要求出9阶和8阶楼梯的答案,因此本题肯定是采用递归的方法来计算。假设n==10,那么func(10)=func(9)+func(8)...直到func(2)或者func(1)结束
下面是我第一次给出的答案
python
class Solution:
def climbStairs(self, n: int) -> int:
if n >= 3:
return self.climbStairs(n - 1) + self.climbStairs(n - 2)
elif n == 2:
return 2
else:
return 1
结果显示超过了时间的限制,有什么办法解决这个问题吗?在递归里面反复的计算了相同的内容,例如求func(3)的时候需要求func(2),求fun(4)时也需要求func(2)这就造成了时间的浪费,因此我们可以将一些计算结果存储下来减少计算量。
python
class Solution:
my_dict = {}
def climbStairs(self, n: int) -> int:
if self.my_dict.get(n) is not None: # 先判断有没有计算过这个值
return self.my_dict.get(n)
tempResult = 0
if n >= 3:
tempResult = self.climbStairs(n - 1) + self.climbStairs(n - 2)
elif n == 2:
tempResult = 2
else:
tempResult = 1
self.my_dict[n] = tempResult
return tempResult
