1. 程式人生 > 實用技巧 >劍指offer(9):斐波那契數列--舉矩形覆蓋

劍指offer(9):斐波那契數列--舉矩形覆蓋

題目描述

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? 比如n=3時,2*3的矩形塊有3種覆蓋方法: 寫出數列後,我們發現這仍然是一個斐波那契問題,遞迴公式為      n n<=3 f(n)      f(n-1)+f(n-2) n>3 解析,對於一個1*2的小矩形,我們可以豎著放,那剩下的2*(n-1)大矩形有f(n-1)種覆蓋方法 如果橫著放,那麼下邊也只能橫著放,那麼剩下的2*(n-2)大矩形有f(n-2)種覆蓋方法 遞迴求解:
class Solution {
public: int rectCover(int number) { if(number<3) return number; else return rectCover(number-1)+rectCover(number-2); } };

非遞迴求解:

public class Solution {
    public int RectCover(int target) {
        int r1 = 1;
        int r2 = 2;
        int r3 = target;
        
for(int i=3;i<=target;i++){ r3 = r1 + r2; r1 = r2; r2 = r3; } return r3; } }