Leetcode practice (6)
程序员文章站
2022-05-12 08:48:50
...
Climbing Stairs
- 题目描述:爬楼梯,一次只能爬1step or 2step,给定一个非负数,问有多少种不重复的爬法。
- 思路:乍看一下题目,还在思考如何枚举出所有可能的情况,eg,给定2,那么组合就是【1,1】,【2】;给定3,那么组合就是【1,1,1】【1,2】【2,1】, 其实用递归的思路去想就是当元素值等于1 or 等于2时,停止。后面发现该题目就是Fibonacci 数列的换个描述方式而已,自己还是太愚蠢了。eg,【1,1,3,5,8....】, 给定数是数列的索引,所以先生成Fibonacci 数列,找到对应目标索引 (即使给定非负数) 下的值即可。下面给出两个解法,一个是时间复杂度为 O(n), 空间复杂度为 O(1), 一个是时间复杂度为 O(log n), 空间复杂度为 O(1)。前一种解法总所周知,后一种解法通过数学变换直接表示出通项公式,我表示很风骚,论学好数学的重要性。
- code:
class Solution:
def climbStairs(self, n: int) -> int:
first, second = 1, 1
if n == 0 or n == 1:
return 1
for i in range(2, n + 1):
first, second = second, first + second
return second
class Solution:
def climbStairs(self, n: int) -> int:
formula_1 = 1 / math.sqrt(5)
formula_2 = ((1 + math.sqrt(5)) / 2)**(n+1)
formula_3 = ((1 - math.sqrt(5)) / 2)**(n+1)
return int(formula_1 * (formula_2 - formula_3))
- 总结:题目本身是换汤不换药,换个汤还把我弄的蒙蔽了一下,实在不应该。第二种直接用公式来计算出 Fibonacci 数列对应索引的值这个方法确实风骚,应该是对该数列的一种近似表达。但是我在提交执行的时候,结果显示出来时间复杂度和空间复杂度的消耗却没有像理论猜想那样,不清楚具体是什么原因,在此记录,日后发现。