其他分享
首页 > 其他分享> > 【力扣】爬楼梯

【力扣】爬楼梯

作者:互联网

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs

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

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

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

示例 1:

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

我的思路,二叉树深度优先搜索遍历的递归,每一步数字都可以选择走1这个分支,或者2这个分支,当该路径上的和满足题目给的数字条件,记录这条可行的路径(路径数+1)。运行时间超时。

 1 class Solution:
 2     def climbStairs(self, n: int) -> int:
 3         global b
 4         b = 0
 5         def add(x, n):
 6             global b
 7             if x == n:
 8                 b = b + 1
 9             elif x > n:
10                 return
11             else:
12                 add(x + 1, n)
13                 add(x + 2, n)
14 
15         add(1, n)
16         add(2, n)
17         return b

附上比较全的解法,斐波那契数列的推到太难了暂时不看。

其中,动态规划方法,

dp[i] = dp[i-1] + dp[i-2]

表示,如果要上$i$级台阶,方法是从第$i-1$级台阶再上一级与从第$i-2$级台阶上两级的方法的和。

作者:821218213
链接:https://leetcode-cn.com/problems/climbing-stairs/solution/70zhong-quan-chu-ji-python3hui-ji-liao-ti-jie-qu-w/

 1 # 直接递归解法,容易超时,python可以加个缓存装饰器,这样也算是将递归转换成迭代的形式了
 2 # 除了这种方式,还有增加步长来递归,变相的减少了重复计算
 3 # 还有一种方法,在递归的同时,用数组记忆之前得到的结果,也是减少重复计算
 4 class Solution:
 5     @functools.lru_cache(100)  # 缓存装饰器
 6     def climbStairs(self, n: int) -> int:
 7         if n == 1: return 1
 8         if n == 2: return 2
 9         return self.climbStairs(n-1) + self.climbStairs(n-2)
10 
11 # 直接DP,新建一个字典或者数组来存储以前的变量,空间复杂度O(n)
12 class Solution:
13     def climbStairs(self, n: int) -> int:
14         dp = {}
15         dp[1] = 1
16         dp[2] = 2
17         for i in range(3,n+1):
18             dp[i] = dp[i-1] + dp[i-2]
19         return dp[n]
20 
21 # 还是DP,只不过是只存储前两个元素,减少了空间,空间复杂度O(1)
22 class Solution:
23     def climbStairs(self, n: int) -> int:
24         if n==1 or n==2: return n
25         a, b, temp = 1, 2, 0
26         for i in range(3,n+1):
27             temp = a + b
28             a = b
29             b = temp
30         return temp
31 
32 # 直接斐波那契数列的计算公式喽
33 class Solution:
34     def climbStairs(self, n: int) -> int:
35         import math
36         sqrt5=5**0.5
37         fibin=math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1)
38         return int(fibin/sqrt5)
39 
40 # 面向测试用例编程
41 class Solution:
42     def climbStairs(self, n: int) -> int:
43         a = [1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903]
44         return a[n-1]

 

标签:爬楼梯,int,self,力扣,def,climbStairs,return,dp
来源: https://www.cnblogs.com/Harukaze/p/15038532.html