我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?
数据范围:
进阶:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
注意:约定 n == 0 时,输出 0
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
2*1的小矩形的总个数n
覆盖一个2*n的大矩形总共有多少种不同的方法(从同一个方向看)
0
0
1
1
4
5
class Solution: def rectCover(self , number: int) -> int: # write code here if number < 3: return number res = self.mySolution1(number) return res def mySolution2(self, number): # 递归-O(n^2)O(n) 算上递归空间占用 # python递归超时 def rec(num): if num < 1: return 0 elif num < 3: # 如果不限制 return 0 的话就会无限循环下去gg return num else: return rec(num-1) + rec(num-2) res = rec(number) return res def mySolution1(self, number): # 动态规划-O(n)O(1) pre,mid,order = 1, 2, 0 res = 0 for i in range(3, number+1): order = mid + pre pre = mid mid = order if order > res: res = order return res def mySolution(self, number): # 动态规划-O(n)O(n) dp = [0]*(number+1) dp[0], dp[1], dp[2] = 0, 1, 2 for i in range(3, number+1): dp[i] = dp[i-2] + dp[i-1] return dp[-1]
# -*- coding:utf-8 -*- class Solution: def rectCover(self, n): # write code here res = {0:0,1:1,2:2} for i in range(3,n+1): res[i] = res[i-1] + res[i-2] return res[n]
# -*- coding:utf-8 -*- class Solution: def rectCover(self, number): # write code here if number<=2: return number a=1 b=2 for i in range(number-2): a,b=b,a+b return b
第一次摆放一块1*2的小矩阵,则摆放方法总共为f(target-2)
代码: