LeetCode: 013-Climbing Stairs

15 篇文章 0 订阅
14 篇文章 0 订阅

Climbing Stairs

题目大意是指,用1,2排列,使其和为n,有多少种排法。

基本思路

大概就是对不同数量的1,挑选1的位置。
挑选的话,就需要求组合数,
求组合数,就需要阶乘?!

阶乘就会特别慢,

基本方案

class Solution(object):
    def pmt(self, a, all):
        # 阶乘
        f = lambda x: x and x * f(x - 1) or 1
        return f(all)/ (f(a) * f(all - a)) 

    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        num_2, num_1 = n / 2, n % 2
        ways = 1
        for i in xrange(num_2):
            num_21 = num_1 + i * 2
            num_22 = num_2 - i
            ways += self.pmt(num_21, num_21 + num_22)
        return ways

还没看到结果, 反正是慢成狗了。
学习到了阶乘的简短写法
x and 的写法是为了保证输入为0的时候的返回值。

改进方案

先写公式:

Σnum_2i=0Combination(i,i2+num_1+num_2i)=Σnum_2i=0Combination(i,i+num_1+num_2)=Σnum_2i=0(i+num_1+num_2)!i!(num_1+num_2)!

显然这个公式是可以化简的:
Σnum_2i=0(i+num_1+num_2)!i!(num_1+num_2)!=Σnum_2i=0(i+num_1+num_2)!i!(num_1+num_2)!

假设有: K=num_1+num_2
那么:
=1K!Σnum_2i=0(K)(K+1)...(K+i)

考虑到这个式子比较方便写程序了。


class Solution(object):
    def climbStairs(self, n):
        if n == 0:
            return 1
        num_1, num_2 = n % 2, n / 2
        k = num_1 + num_2
        f = lambda x: x and x * f(x - 1) or 1
        v = lambda x, i:(i+1) and v(x, i-1) * (x + i) or 1
        ways = sum(map(lambda s: v(k, s), range(num_2))) / f(k)
        return ways

写完之后,发现确实快很多,
不过结果不对, 显然上面有一步推错了(Orz)。
明天再改吧。。。要睡觉了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值