这道题稍微有点难度,首先第一个想法就是,使用递归算法,递归函数是f(n)= f(n-1)+f(n-2),递归终止条件是,f(0)=0,f(1)=1,f(2)=2,但是,会爆复杂度,因为有一个n=45的时候,复杂度就爆炸了。那么就需要思考一下其他策略了。可以发现,假设有x个1,y个2,那么必须满足n = x + 2*y,也就是,x = n - 2*y,y和x是一一对应关系,所以y的取值范围就是【0,n/2】,那么对这n/2+1种情况进行讨论即可,先从y==0开始,此时,x==n,那么只有一种情况;当y==k时候,x = n-2*k,将这y个2在x+y个位置种放好就可以了,转化为组合问题,即C(x+y,y);对每一种情况都用组合数算一次,就有如下代码了
class Solution {
public:
int climbStairs(int n) {
if(n== 0 || n == 1 || n == 2) return n;
int pos_y = n / 2;
int res = 0;
for(int i=0;i<=pos_y;i++){
if(i==0) res+=1;
else{
res += c(i,n-i*2+i);
}
}
return res;
}
int c(int m,int n){
if(n<=m) return 1;
if(m>=n/2){m = n-m;}
double t_m = m,t_n = n;
double a=1,b=1;
for (int i = 0; i < m; ++i)
{
a *= t_m--;
b *= t_n--;
}
return (int) (b/a+0.5);
}
};
成绩如下: