10 圖解劍指Offer 矩形覆蓋 Java題解

10 圖解劍指Offer 矩形覆蓋 Java題解

題目鏈接

題目描述

我們可以用21的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

比如n=3時,2*3的矩形塊有3種覆蓋方法:
在這裏插入圖片描述

題解:

具體看圖解

思路: 斐波那契額數列問題,此題前n項和公式 f(n) = f(n - 1) + f(n -2) (n>2)
注意此題 target = 0 結果爲0, target = 1 結果爲 1 ,target = 2 結果爲2 與普通斐波那契額數列不同,n從3開始。
根據公式可以用遞歸解決此類問題,但是太耗費時間不推薦,遞歸的思想是重複的解決子問題。
故採用記憶優化的算法,將遞歸子問題的結果存入hashMap中,就可以避免重複計算子問題的結果。計算f(n) 需要計算f(n -1) f(n- 2) ,f(n -1) 和 f(n -2)的計算也要以此類推。
又因爲f(n) = f(n -1) + f(n - 2) 故最後只需要三個變量a,b,sum,遍歷數列,在依次將和改爲下一個和,即可實現。sum = a +b a = b b = sum。 最後 返回 a即可

圖解:

在這裏插入圖片描述

代碼:

public class Solution {
    public int RectCover(int target) {
       if(target == 0 || target == 1 || target == 2) return target;
       int a = 1, b = 2,sum;
        
       for(int i = 2;i < target; i++){
           sum = a + b;
           a = b;
           b = sum;
       }
       return b;
    }
}

複雜度

空間複雜度: 空間複雜度爲O(1) 三個int型空間。
最壞時間複雜度: 遍歷時間複雜度O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章