剑指offer 斐波那契数列+跳台阶+变态跳台阶

  • 斐波那契数列
    很简单的一道题,f[0]=0,f[1]=1,f[2]=1,f[n]=f[n-1]+f[n-2]。
    不过看书之后发现事情并没有那么简单。
    先码住,如果之后看书之后发现有更好解法再更新。
# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        f = [1 for i in range(40)]
        
        f[0] = 0
        for i in range(3, 40):
            f[i] = f[i-1]+f[i-2]
        
        return f[n]
  • 跳台阶
    由于一只青蛙一次可以跳上1级台阶,也可以跳上2级,所以如果到第i级台阶总共有两种跳法,一种是从第(i-1)级台阶跳上来,另一种是从第(i-2)级台阶跳上来,所以到第i级台阶的跳法总和就是到第(i-1)和第(i-2)级台阶的跳法的总和,即
    d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i]=dp[i-1]+dp[i-2] dp[i]=dp[i1]+dp[i2]
    是不是和上一题的那个公式很像,不过这道题与上道题略有不同。上道题的0位置的值为0,而本题的0位置的值为1,所以后面位置的值相应改变。
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        dp = [1, 1]
        
        for i in range(2, number+1):
            dp.append(dp[i-1]+dp[i-2])
        
        return dp[number]
  • 变态跳台阶
    这道题是跳台阶问题的升级版。由于一步可以跳1到n个台阶,所以到第n个台阶有n种跳法,分别是从第0到第(n-1)节台阶开始跳。即:
    d p [ i ] = ∑ j = 0 i − 1 d p [ j ] dp[i]=\sum_{j=0}^{i-1}{dp[j]} dp[i]=j=0i1dp[j]
    而此时注意到
    d p [ i − 1 ] = ∑ j = 0 i − 2 d p [ j ] dp[i-1]=\sum_{j=0}^{i-2}{dp[j]} dp[i1]=j=0i2dp[j]
    所以
    d p [ i ] = 2 d p [ i − 1 ] dp[i]=2dp[i-1] dp[i]=2dp[i1]
    而由于dp[0]=1,dp[1]=1,dp[2]=2,可知:
    d p [ i ] = 2 i − 1 dp[i]=2^{i-1} dp[i]=2i1
    思考:python中 k n k^n kn用k**n表示
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        
        if number == 0:
            return 1
        
        return 2**(number-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值