剑指 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(x−1)+f(x−2)
它意味着爬到第
x
x
x 级台阶的方案数是爬到第
x
−
1
x-1
x−1 级台阶的方案数和爬到第
x
−
2
x-2
x−2 级台阶的方案数的和。很 好理解, 因为每次只能爬 1 级或 2 级, 所以
f
(
x
)
f(x)
f(x) 只能从
f
(
x
−
1
)
f(x-1)
f(x−1) 和
f
(
x
−
2
)
f(x-2)
f(x−2) 转移过来, 而这里要统计方案 总数,就需要对这两项的贡献求和。
以上是动态规划的转移方程, 下面讨论边界条件。从第 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 n−1级一步跳上来,也可以不经过 n − 1 n-1 n−1级跳上来,所以 f ( n ) = 2 ∗ f ( n − 1 ) f(n)=2*f(n-1) f(n)=2∗f(n−1)。
推公式也能得出:
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(n−1)+f(n−2)+...+f(n−(n−1))+f(n−n)=f(0)+f(1)+f(2)+...+f(n−1)
由于 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(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 ) = 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(n−1)+f(n−1)=2∗f(n−1)
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]
参考
以上是关于剑指 Offer 10- II. 青蛙跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章