斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
(斐波那契数列:0,1,1,2,3,....,即后一项为前两项之和的数列)
demo:
class Solution:
def Fibonacci(self, n):
# write code here
if n<=1:
return n
f1,f2 = 0,1
for i in range(n-1):
f1,f2 = f2,f1+f2
return f2
找规律:
index = 0,1 时候:Fibonacci = 0,1
index = 2 , Fibonacci[2] =Fibonacci[0]+Fibonacci[1]
index = 3,Fibonacci[3] =Fibonacci[1]+Fibonacci[2]
所以:Fibonacci[n] =Fibonacci[n-2]+Fibonacci[n-1]
所以可以用递归和动态规划将问题划分为子问题进行解决。
青蛙跳
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析:青蛙一次跳一级或者二级,共n级台阶。最后一次青蛙可能跳1级,可能跳2级,这样的倒推思路,倒数第二次跳,仍然可能跳1级或者2级,因此n级台阶的所跳次数与n-1级和n-2级台阶所跳方法相关,并为两者之和。
class Solution:
def jumpFloor(self, number):
# write code here
if number<=2:
return number
f1,f2 = 1,2
for i in range(2,number):
f1,f2 = f2,f2+f1
return f2
找规律:
台阶数1:共1种;
台阶数2:共2种;
台阶数3:共3种;
台阶数4:共5种;
台阶数5:共8种;
台阶数为n,则有f(n)种方法:f(n)=f(n-1)+f(n-2)
变态青蛙跳
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:n级台阶,青蛙可跳的台阶数目为1、2、3...n,则跳到n级台阶与n级台阶、n-1级台阶、n-2级台阶直到1级台阶的跳法均相关,即为它们之和。即f(n)=f(1)+f(2)+f(3)+...+f(n-1)+1,f(n-1)=f(1)+f(2)+...+f(n-2)+1;这样的数列计算方式过于复杂,换一种方式思考:青蛙可跳台阶数目为1-n,那么对于n个台阶,所有的情况均为跳或者不跳,即2^(n-1)种跳法。
class Solution:
def jumpFloorII(self, number):
# write code here
return 2**(number-1)
规律:
台数1:台数1,青蛙跳的方式有1种,可以选择跳与不跳,共2^(1-1)=1种;
台数2:台数2,青蛙跳的方式有2种,可以选择跳与不跳,共2^(2-1)=2种;
台数3:台数3,青蛙跳的方式有3种,可以选择跳与不跳,共2^(3-1)=4种;
台数4:台数4,青蛙跳的方式有4种,可以选择跳与不跳,共2^(4-1)=8种;
因此:
台数n:台数n,青蛙跳的方式有n种,可以选择跳与不跳,共2^(n-1)种;
或:
class Solution:
def jumpFloorII(self, number):
# write code here
f1 = 1
for i in range(number-1):
f1 = 2*f1
return f1