Leetcode刷題 70. 爬樓梯

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

};

成績如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章