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)