題目描述
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。n<=39
示例1輸入4
返回值3
方法一:遞迴(從上向下計算)題目分析,斐波那契數列公式為:f[n] = f[n-1] + f[n-2],
初始值f[0]=0, f[1]=1,目標求f[n]
看到公式很親切,**秒秒鐘寫完。
int
fibonacci
(int n)
時間複雜度:o(2^n)
空間複雜度:遞迴棧的空間
優點:
**簡單好寫,缺點:
慢,會超時(效率低)
效率低的原因:
方法二:迴圈(從下向上計算)------------推薦
為了優化
方法一(遞迴
)中的重複計算,解決辦法是按上面樹狀圖從下向上
(迴圈
)計算
class
solution
return fibn;}}
;
時間複雜度:o(n)
空間複雜度:o(1)
題目描述
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。
示例1輸入1
返回值1
示例2輸入
4返回值
5
題解:只有1級台階:f(1)=1;
只有2級台階:f(2)=2;----------一種跳兩次,一次跳1級;一種跳一次,一次跳2級
有n級台階 :
這就得到了熟悉的公式:
遞迴
class
solution
};
class
solution
return floorn;}}
;
時間複雜度:o(n)
空間複雜度:o(1)
題目描述
乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
示例1輸入3
返回值4
題解:設
f[i] 表示 當前跳道第 i 個台階的方法數。那麼f[n]就是所求答案。
跳上n級,有如下情況:
第一步跳1級,還剩n-1級,此時跳法數等於後面n-1級台階跳法數:f(n-1)
第一步跳2級,還剩n-2級,此時跳法數等於後面n-2級台階跳法數:f(n-2)
。。。。。。
第一步跳n-1級,還剩1級,此時跳法數等於後面1級台階跳法數:f(n-(n-1))=f(1)=1
第一步跳n級,還剩0級,此時跳法數等於f(n-n)=f(0)=1
即:
f[n] = f[n-1] + f[n-2] + … + f[0], 初始條件f[0] = f[1] = 1
方法一:暴力方法
根據公式,我們就可以先求f[2],然後f[3]…f[n-1], 最後f[n]
int
jumpfloorii
(int n)
}return f[n]
;}
時間複雜度:o(n^2)
空間複雜度:o(n),建立了乙個vectorf(n+1, 0);
易知 f(n)=f(n-1)+f(n-2)+……f(1)+f(0)
f(n-1)=f(n-2)+……f(1)+f(0)
兩式相減得f(n)=2f(n-1)
以n=4為例:
遞迴實現(從上向下)
class
solution
};
時間複雜度:o(n)
空間複雜度:遞迴棧的空間
迴圈實現(從下向上)---------推薦
class
solution
return n;}}
;
時間複雜度:o(n)
空間複雜度:o(1)
題目描述
我們可以用2*1
的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1
的小矩形無重疊地
覆蓋乙個2*n
的大矩形,總共有多少種方法?
比如n=3時,2*3的矩形塊有3種覆蓋方法:
示例1輸入4
返回值5
題解參考這裡
即,用f [n]表示2*n
大矩陣 的方法數。
顯然:n=1,f(1)=1;
n=2,f(2)=2;
對於2*n
大矩陣,覆蓋它的最右面的2*1
小矩陣,要麼是豎著的,要麼是橫著的;
最右邊是豎著的需要1個小矩陣(去除這乙個豎著的,相當於剩下個2*n-1
大矩陣,此時覆蓋方法是f(n-1)
),
橫著的需要2個(去除這兩個橫著的,相當於剩下個2*n-2
大矩陣,此時覆蓋方法是f(n-2)
)。
可以得出:
f[n] = f[n-1] + f[n-2],初始條件f[1] = 1, f[2] =2
是斐波那契數列,則用從下向上的迴圈方式
實現它:
class
solution
return fn;}}
;
1.斐波那契數列的題都是從上向下分析,直觀上用遞迴實現,但實際上都會考慮效率問題,採用for迴圈的形式按從下向上寫**。 JZ7 斐波那契數列
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0,第1項是1 n 39 輸入4返回值 3class solution return c 複雜度分析 int fibonacci int n 複雜度分析 分析 遞迴實現的 簡潔易懂,但是需要注意的是,遞迴...
JZ10 I 斐波那契數列
原題鏈結 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 1000000007...
斐波那契數列10
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 斐波那契數列屬於經典的遞迴問題,對於這題的求解,我們首先要知道斐波那契數列的狀態轉移式,即f n f n 1 f n 2 且在n 1或2時,f n 1。public static int feibol...