矩形覆盖
思想:
分治法(递归法):
分治法,分而治之。就是将原问题划分为n个规模较小,结构与原问题类似的小问题进行处理,递归地解决这些问题,然后再合并求解的过程。
分治法在解决的流程上分为三个步骤:
1.分解:将原问题划分为n个规模较小,结构与原问题类似的小问题。
2.解决:若子问题规模小,足以处理,则求解,否则继续递归处理。
3.合并:将子问题的解,合并成为原问题的解。
第一步如果采用竖方向放:
那么问题就变成了用 n-1 个 2x1 的小矩形去覆盖 2x(n-1) 的大矩形。
第一步如果采用横方向放:
那么问题就变成了用 n-2 个2x1 的小矩形去覆盖 2x(n-1) 的大矩形。
递归公式为:Fn = Fn-1 + Fn-2
递归法太耗空间资源,可以只保存前两项的结果就可以了。
python
1 # -*- coding:utf-8 -*- 2 class Solution: 3 def rectCover(self, number): 4 # write code here 5 res = [0,1,2] 6 if number <= 2: 7 return res[number] 8 while number!=len(res)-1: 9 res.append(res[-1]+res[-2]) 10 return res[-1]
c++
用一个双端队列来保持前两项
1 class Solution { 2 public: 3 int rectCover(int number) { 4 if(number<=0) return 0; 5 else if(number==1) return 1; 6 else if(number==2) return 2; 7 deque<int> res; 8 res.push_back(1); 9 res.push_back(2); 10 for(int i=0;i<number-2;i++){ 11 res.push_back(res.front()+res.back()); 12 res.pop_front(); 13 } 14 return res.back(); 15 } 16 };