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

};

成绩如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值