剑指offer--day04
1.1题目:变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
1.2解题思路:
- 当n=1时,结果为1;
- 当n=2时,结果为2;
- 当n=3时,结果为4;
以此类推,我们使用数学归纳法不难发现,跳法f(n)=2^(n-1)。
1.3代码:
1 class Solution: 2 def jumpFloorII(self, number): 3 # write code here 4 if number <= 1: 5 return number 6 total = 1 7 for i in range(1, number): 8 total *= 2 9 return total
2.1题目:矩阵覆盖:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
2.2解题思路:
以2x8的矩形为例。示意图如下:
我们先把2x8的覆盖方法记为f(8)。用第一个1x2小矩阵覆盖大矩形的最左边时有两个选择,竖着放或者横着放。当竖着放的时候,右边还剩下2x7的区域,这种情况下的覆盖方法记为f(7)。接下来考虑横着放的情况。当1x2的小矩形横着放在左上角的时候,左下角和横着放一个1x2的小矩形,而在右边还剩下2x6的区域,这种情况下的覆盖方法记为f(6)。因此f(8)=f(7)+f(6)。此时我们可以看出,这仍然是斐波那契数列。
2.3代码:
1 # -*- coding:utf-8 -*- 2 class Solution: 3 def rectCover(self, number): 4 # write code here 5 if number <= 2: 6 return number 7 first = 1 8 second = 2 9 f = 0 10 for i in range(3, number+1): 11 f = first + second 12 first = second 13 second = f 14 return f


浙公网安备 33010602011771号