LeetCode的第70题:https://leetcode.com/problems/climbing-stairs/description/
该题在Solution中囊括了六种解法,包括从暴力破解到斐波那契以及算法优化。
这里新增一种思路:组合数
爬楼梯问题,也就是1步、2步的走最终到达终点。
可以抽象成取n个球,可以一次取两个,也可以一次取一个,直到最终取完,共有多少取法。
从1个2和(n-2)个1 …… 到n/2个2和(n-n/2)个1的排列组合数总和,代码如下
class Solution(object):
def climbStairs(self, n):
count = 0
for i in xrange(0, n//2+1):
count += self.cni(n-i, i)
return count
def cni(self,n,i):
result = 1
for j in range(0, i):
result = result * (n-j) // (j+1)
return result
空间复杂度O(1),时间复杂度O(n^2),不如斐波那契简便