青蛙跳台阶题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
变态跳台阶题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
类似于Fibonacci数列的算法问题
台阶数为number或n,跳法数为ret,f(n)代表跳到第n阶台阶的跳法数
由于青蛙每次只能跳一个台阶或者两个台阶,故
f(n) = f(n-1) + f(n-2)
注:青蛙跳到每一个台阶只有两种可能
1.从第n-1阶台阶一次跳1阶,到达第n阶
2.从第n-2阶台阶一次跳2阶,到达地n阶
class Solution:
def jumpFloor(self, number):
# write code here
if number < 1:
return 0
if number == 1:
return 1
if number == 2:
return 2
ret = 0
a = 1
b = 2
for i in range(3,number + 1):
ret = a + b
a = b
b = ret
return ret
#此代码缺少输出输出
注:range()函数是一个左闭右开的区间,注意区分Fibonacci数列算法与青蛙跳台阶算法中range()函数的循环始终
三、变态跳台阶算法(贪心算法)台阶数为number或n,跳法数为ret,f(n)代表跳到第n阶台阶的跳法数
方法一:找规律number = 0 时,ret = 0
number = 1 时,ret = 1
number = 2 时,ret = 2
number = 3 时,ret = 4
number = 4 时,ret = 8
…
number = n 时,ret = 2^(n-1)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
return 2 ** (number - 1)
#此代码缺少输入输出
方法二:贪心算法
算法流程解析
从第n个台阶开始倒推:
1:可能是从第n-1个台阶跳到第n个台阶(跳了1阶)
2:可能是从第n-2个台阶跳到第n个台阶(跳了2阶)
…
n-1:可能是从第1个台阶跳到第n个台阶(跳了n-1阶)
推得 f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(1)
f(n-1) = f(n-2) + f(n-3) + f(n-4) + … +f(1)
故 f(n) = f(n-1) + f(n-1)
=2 * f(n-1)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 0:
return 0
if number == 1:
return 1
ret = 1
a = 1
for i in range(2,number + 1):
ret = 2 *a
a = ret
return ret
#此代码缺少输出输出