一、题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1 :
输入:2 返回值:2示例2 :
输入:7 返回值:21
二、解题思路
1、按照题解直接写这道题就好了,当只有1个台阶的时候,只有一种方法
2、当有2个台阶的时候,有2种跳法1)一次跳1个,2)一次跳2个
3、当有n个台阶的时候,它可以从n-1个台阶跳过来,也可以从n-2个台阶跳过来
4、所以n台阶种类= n-1台阶种类+ n-2台阶种类
跳到第n级台阶,上一级可能是n-1,也可能是n-2;假设到第n级最大的可能为f(n),那么由前面可以得到f(n)=f(n-1)+f(n-2);
波拉契数列第0项是0,依此类推:0,1,1,2,3,5,8…;
跳台阶从1开始:1,2,3,5,8…;–>>青蛙跳台阶问题: f(0)=1 , f(1)=1 , f(2)=2;
–>>斐波那契数列问题: f(0)=0 , f(1)=1 , f(2)=1;
所以,“伪斐波拉契数列”,是正常的斐波拉契数列的第二项开始的,解法自然类似斐波拉契数列。
类似,可以采用动态规划解题【 以斐波那契数列性质 f(n + 1) = f(n) + f(n – 1)为转移方程】
1、状态定义: 设 dp 为一维数组,其中 dp[i] 的值代表 斐波那契数列第 i 个数字 。
2、转移方程: dp[i + 1] = dp[i] + dp[i – 1],即对应数列定义 f(n + 1) = f(n) + f(n – 1) ;
3、初始状态: dp[0] = 1, dp[1] = 1 ,即初始化前两个数字;
4、返回值: dp[n],即斐波那契数列的第 n 个数字。
三、解题代码
(一)类似斐波拉契数列
class Solution:
def jumpFloor(self, number):
# write code here
if number == 0:
return 1 ## f(0)=1
if number == 1:
return 1 ## f(1)=1
a = 1
b = 1
i = 3
for i in range(2, number+1):
sum = a+b
a = b
b = sum
return sum % 1000000007
(二)动态规划法:定义 dp []数组
class Solution:
def jumpFloor(self, number):
# write code here
if number == 1:
return 1
if number == 2:
return 2
dp = [1 for _ in range(number + 10)]
for i in range(2,number + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[number] % 1000000007
或者
class Solution:
def jumpFloor(self, number):
# write code here
dp = [1, 1]
for i in range(2, n + 1):
dp.append(dp[i - 1] + dp[i - 2])
return dp[n] % 1000000007
四、跳台阶扩展问题
- 描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法
示例1
输入:3
返回值:4
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 0:
return 1
if number == 1:
return 1
ans = 1
for i in range(1, number):
ans = 2*ans
return ans
后记:
range () 函数的使用:
range(start, stop[, step]),分别是起始、终止和步长
- range(3)即:从0到3,不包含3,即0,1,2
- range(1,3) 即:从1到3,不包含3,即1,2
- range(1,3,2)即:从1到3,每次增加2,因为1+2=3,所以输出只有1。第三个数字2是代表步长。如果不设置,就是默认步长为1。
- range()在for循环中的作用及技巧。range可以根据给定的次数,重复动作,来看一个range与for循环最简单的例子:
x = ‘iplaypython’
for i in x:
… print i,
…
i p l a y p y t h o n
range(len(x))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
len(x)
11
for i in range(len(x)):
… print x[i],
…
i p l a y p y t h o n
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99775.html