剑指 Offer 10- II. 青蛙跳台阶问题

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 10- II. 青蛙跳台阶问题相关的知识,希望对你有一定的参考价值。

剑指 Offer 10- II. 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2

示例 2:

输入:n = 7
输出:21

示例 3:

输入:n = 0
输出:1

提示:

0 <= n <= 100

动态规划

f ( x ) f(x) f(x) 表示爬到第 x x x 级台阶的方案数,考虑最后一步可能跨了一级台阶, 也可能跨了两级台阶, 所以可以列出如下式子:
f ( x ) = f ( x − 1 ) + f ( x − 2 ) f(x)=f(x-1)+f(x-2) f(x)=f(x1)+f(x2)
它意味着爬到第 x x x 级台阶的方案数是爬到第 x − 1 x-1 x1 级台阶的方案数和爬到第 x − 2 x-2 x2 级台阶的方案数的和。很 好理解, 因为每次只能爬 1 级或 2 级, 所以 f ( x ) f(x) f(x) 只能从 f ( x − 1 ) f(x-1) f(x1) f ( x − 2 ) f(x-2) f(x2) 转移过来, 而这里要统计方案 总数,就需要对这两项的贡献求和。

以上是动态规划的转移方程, 下面讨论边界条件。从第 0 级开始爬的,所以从第 0 级爬到第 0 级可以看作只有1种方案, 即 f ( 0 ) = 1 ; f(0)=1 ; f(0)=1; 从第 0 级到第 1 级也只有一种方案, 即爬一级, f ( 1 ) = 1 f(1)=1_{} f(1)=1 。这 两个作为边界条件就可以继续向后推导出第 n n n 级的正确结果。

根据转移方程得 到 f ( 2 ) = 2 , f ( 3 ) = 3 , f ( 4 ) = 5 , … … f(2)=2, f(3)=3, f(4)=5, \\ldots \\ldots f(2)=2,f(3)=3,f(4)=5,, 把这些情况都枚举出来,发现计算的结果是正确的。

class Solution(object):
    def numWays(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <=1:
            return 1
        if n ==2:
            return 2
        f1 , f2 = 1, 2
        for _ in range(2,n):
            f2 , f1 = f1+f2, f2
        return f2%1000000007
        

变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路: n = 0 n=0 n=0时, f ( n ) = 0 f(n)=0 f(n)=0 n = 1 n=1 n=1时, f ( n ) = 1 f(n)=1 f(n)=1 n = 2 n=2 n=2时, f ( n ) = 2 f(n)=2 f(n)=2;假设到了 n n n级台阶,我们可以 n − 1 n-1 n1级一步跳上来,也可以不经过 n − 1 n-1 n1级跳上来,所以 f ( n ) = 2 ∗ f ( n − 1 ) f(n)=2*f(n-1) f(n)=2f(n1)

推公式也能得出:

n = n n = n n=n时: f ( n ) = f ( n − 1 ) + f ( n − 2 ) + . . . + f ( n − ( n − 1 ) ) + f ( n − n ) = f ( 0 ) + f ( 1 ) + f ( 2 ) + . . . + f ( n − 1 ) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) = f(0) + f(1) + f(2) + ... + f(n-1) f(n)=f(n1)+f(n2)+...+f(n(n1))+f(nn)=f(0)+f(1)+f(2)+...+f(n1)

由于 f ( n − 1 ) = f ( 0 ) + f ( 1 ) + f ( 2 ) + . . . + f ( ( n − 1 ) − 1 ) = f ( 0 ) + f ( 1 ) + f ( 2 ) + f ( 3 ) + . . . + f ( n − 2 ) f(n-1) = f(0)+f(1)+f(2)+ ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) f(n1)=f(0)+f(1)+f(2)+...+f((n1)1)=f(0)+f(1)+f(2)+f(3)+...+f(n2)

所以 f ( n ) = f ( n − 1 ) + f ( n − 1 ) = 2 ∗ f ( n − 1 ) f(n) = f(n-1)+f(n-1)=2*f(n-1) f(n)=f(n1)+f(n1)=2f(n1)

class Solution:
    def jumpFloorII(self, number):
        if number <= 0:  return 0
        if number == 1: return 1
        if number == 2: return 2
        result = [1,2]
        for i in range(2,number):
            result.append(2*result[-1])
        return result[-1]

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 10- II. 青蛙跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:面试题10-II.青蛙跳台阶问题

剑指Offer面试题10- II. 青蛙跳台阶问题

剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题