computed 與 watch
阿新 • • 發佈:2022-03-30
✅做題思路or感想
這道題是我二刷程式碼隨想錄一路無雙下來第一個遇到的一點思路也沒有的題目,慚愧
dp陣列的含義
-
dp[i]
是指總節點數為n
的不同二叉搜尋樹的種類
遞推公式
- 在對
dp[i]
的遍歷中,總節點數為n
,取其中的j
為一個根節點,則這個節點的左邊有j - 1
個節點,右邊有i - j
個節點,故dp[j] = dp[j - 1] * dp[i - j]
。而j
僅僅是[1, i]
中的一個節點給dp[i]
帶來的二叉搜尋樹的種類數,還要把其餘的節點的種類數都加起來才是dp[i]
- 綜上,有
dp[i] += dp[j - 1] * dp[i - j]
初始化
- 這裡的初始化很奇妙,為了能讓後面的數成立且有效,所以
dp[0] = 1
dp[0]
本身是沒有什麼意義的,僅僅是因為這樣能推出後面的答案而已(難點)
遍歷順序
- 因為從遞推公式知道,後來的值是由前面的值推出,故從小到大
class Solution { public: int numTrees(int n) { int dp[21] = {0}; //初始化 dp[0] = 1; //要倆層的迴圈 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { dp[i] += dp[j - 1] * dp[i - j]; } } return dp[n]; } };