LintCode Python 简单级题目 111.爬楼梯 (斐波纳契数列 青蛙跳)

题目描述:

假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?

您在真实的面试中是否遇到过这个题? yes

比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法

返回 3

标签 

动态规划

 

题目分析:

**设f(n)为n阶台阶的情况下,所有不同的跳法方法的总和!**
1.如果起始跳一阶的话,剩余的n-1阶就有 f(n-1) 种跳法;
2.如果起始跳二阶的话,剩余的n-2阶就有 f(n-2) 种跳法;
所以f(n) = f(n-1) + f(n-2),实际结果即为斐波纳契数。

源码:

 

# 解法一:递归思想
# 如果当前跳了一阶,还剩余n-1阶
# 如果当前跳了两阶,还剩余n-2阶
# 分别对n-1阶与n-2阶求次数,再相加
def jumpFloor(number):
    if number in (1, 2):
        return number
    return jumpFloor(number-1)+jumpFloor(number-2)

a = jumpFloor(10)
print(a)


# 解法二:循环实现,避免阶数过大造成时间超限
def jumpFloor(number):
    if number == 1 or number == 2:
        return number
    n, m = 1, 2
    for i in range(number-2):
        result = m + n
        n, m = m, result
    return result

a = jumpFloor(10)
print(a)


# 解法三:公式
# 设n级台阶,跳了z次,x次跳一阶,y次跳两阶。
# >>> z = x + y
# >>> n = 2*x + y

# @param {integer} n
# @return {integer}
def climbStairs(n):
    def fact(n):
        result=1
        for i in range(1,n+1):
            result*=i
        return result
    total=0
    # for i in range(n/2+1):    # float不能作为range的参数
    for i in range(n//2+1):
        total+=fact(i+n-2*i)/fact(i)/fact(n-2*i)
    return total

a = climbStairs(10)
print(a)

 

 

  

**进阶** 

如果某人可以一次性跳1~n阶,那他跳完n阶台阶有多少种跳法?

**设f(n)为n阶台阶的情况下,所有不同的跳法方法的总和!**
1.如果起始跳一阶的话,剩余的n-1阶就有 f(n-1) 种跳法;
2.如果起始跳二阶的话,剩余的n-2阶就有 f(n-2) 种跳法;
3.如果起始跳三阶的话,剩余的n-2阶就有 f(n-3) 种跳法;

...
n.如果起始跳n阶的话,剩余的n-2阶就有 f(n-n) 种跳法;

假定f(0) = 1,已知一阶台阶时,跳法只有一种,所以f(1) = 1
所以f(2) = 1+1 = 2


得:  f(n) = f(n-1)+f(n-2)+f(n-3)...+...+f(n-(n-1))+f(n-n)

        f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(0)

又:  f(n-1) = f(n-2)+f(n-3)...+...+f(0)
    f(n-2) = f(n-3)+f(n-4)...+...+f(0)

则:  f(n) = 2 * f(n-1)

       = 2^2 * f(n-2)

        = 2^(n-2) * f(2) 

**最终结果f(n) = 2^(n-1) **

 

1

2

3

4

5

6

7

8

9

class Solution:

    """

    @param n: An integer

    @return: An integer

    """

    def climbStairs(self, n):

        # write your code here

        if == 0return 1

        return 2**(n-1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值