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);
    }

};

成绩如下:

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