leetcode刷题(三)

问题链接:https://leetcode.com/problems/climbing-stairs/description/

问题描述:爬一个长度为N的楼梯,每次可以爬一节或者两节楼梯,求出爬楼梯的方法:

我的答案:

class Solution:

    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        count=0
        if n==1:
            return 1
        else:
            t=int(n/2)
            #每次多一个2,就减去1,做从n-i的不放回抽取
            for i in range(1,t+1):
                count+=self.get_last_value(n-i,i)
            return int(count+1)
    def get_value(self,x): 
        if x==0:
            return 1
        if x==1:  
            return x  
        else:  
            return x * self.get_value(x-1)  
    def get_last_value(self,x,m):  
        first = self.get_value(x)   
        second = self.get_value(m)   
        third = self.get_value((x-m))  

        return first/(second * third)  

这里我用的是二项式的方法,时间负责度为O(n),空间负责度为1。


看看大佬的代码:

int getClimbingways(int n){

if(n<1){

retuen 0;

}

if(n==1){

retuen 1;

}

if(n==2){

return 2;

}

int a=1;

int b=2;

int temp=0;

for(int i=3,i<=n,i++)

   temp=a+b;

   a=b;

   b=temp;

}

return temp;

}

这个算法很高级,是动态规划实现,时间负责度为O(n),空间复杂度为O(1)

详细分析参见:http://mp.weixin.qq.com/s/3h9iqU4rdH3EIy5m6AzXsg,超生动可爱的动态规划讲解,还有另一个难题,还没看懂,看懂得同学可要给我科普一下,先谢过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值