题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析
假设跳上n级台阶一共需要F(n)种跳法,由于它可以跳1级台阶或者2级台阶,所以它上一步必定在第n-1,或者第n-2级台阶,所以F(n)=F(n-1)+F(n-2),所以可以用到递归,递归需要出口,只需要分析开始的初始情况即可,与斐波那契数列类似。
n=0;F(n)=0;
n=1;F(n)=1;
n=2;F(n)=2(1+1/2);
代码
不要用F(n)=F(n-1)+F(n-2)这种递归,会重复,不推荐。
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
a = [0,1,2]
if number<3:
return a[number]
for i in range(3,number+1):
a.append(a[i-1]+a[i-2])
return a[number]
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
易知 F(n)=F(n-1)+F(n-2)+……f(1)
F(n-1)=F(n-2)+……F(1)
两式相减得F(n)=2F(n-1)
得到递归规律。
代码
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
n=1
for i in range(1,number):
n=2*n
return n
矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
比如n=3时,23的矩形块有3种覆盖方法:
分析
该题本质也是递归,需要从覆盖的过程找到规律,n的时候的情况要与n-1,n-2的情况联系起来。与前面的例子比较类似,矩阵横着放与竖着放代表两种情况,横着放占用2个,竖着放占用1个。
代码
代码与第一个青蛙跳台阶一模一样,掌握思想很重要!
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
a = [0,1,2]
if number<3:
return a[number]
for i in range(3,number+1):
a.append(a[i-1]+a[i-2])
return a[number]