這道題稍微有點難度,首先第一個想法就是,使用遞歸算法,遞歸函數是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);
}
};
成績如下: