假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
这道题主要是找规律。这道题的规律比较简单,首先是把n除以2确定排列组合中最多可以出现几次2,然后将分别求出每种不同2的个数的排列组合有多少种可能。
举个例子,当n=9时,9/2=4余1。所以方案中2出现的个数可以是0、1、2、3、4共五种,而每种里2出现的位置为,其中i为2的个数。所以一共有N = 55种可能。
python:
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
flag = n / 2
res = 1
for i in range(1,flag+1):
c = i
s = n - i
z = s - 1
while i > 1:
c *= (i - 1)
s *= z
i -= 1
z -= 1
res += (s / c)
return res
C++比较麻烦点,需要给 i 另外复制一个值用于计算阶乘,同时要讲 s 的数据类型设为 double 防止溢出:
class Solution {
public:
int climbStairs(int n) {
int flag = n / 2;
double res = 1;
for(int i = 1; i <= flag;i++){
int j = i;
double c = j;
double s = n - j;
int z = s -1;
while(j > 1){
c *= (j - 1);
s *= z;
j -= 1;
z -= 1;
}
res += (s / c);
}
return res;
}
};