【演算法 in python | DP】斐波那契數列vs卡塔蘭數列
阿新 • • 發佈:2018-11-01
1. 斐波那契數列
公式:
應用:爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
class Solution: def climbStairs(self, n): if n <= 1: return 1 res = [0 for i in range(n+1)] res[0] = 1 #0層樓梯不用爬,1種 res[1] = 1 for i in range(2, n+1): res[i] = res[i-1] + res[i-2] return res[-1]
2. 卡塔蘭數
公式:
應用:不同二叉搜尋樹
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
二叉搜尋樹,左子樹節點小於根,右子樹節點大於根。遞迴求解:
res[i]表示有i個節點時,樹的種類數。初始化res[i] = 0。
n == 0時,只有一種樹,res[0] = 1
n == 1時,當以1為根時,左子樹種類數res[0], 右子樹種類數res[0], 則res[1] = res[0]*res[0]
n== 2 時,當以1為根時,左子樹種類數res[0], 右子樹種類數res[1], 則res[2] += res[0]*res[1]
當以2為根時,左子樹種類數res[1], 右子樹種類數res[0],則res[2] += res[1]*res[0]
以此類推。。。
class Solution: def numTrees(self, n): """ :type n: int :rtype: int """ #res[i] 指i個數時,二叉搜尋樹個數 res = [0 for i in range(n+1)] res[0] = 1 #n為0時,個數為1 for i in range(1, n+1): #當n為i時,樹的個數為以1~i每個數為根時左子樹*右子樹 for j in range(1,i+1): res[i] += res[j-1]*res[i-j] return res[-1]