1. 程式人生 > 實用技巧 >2020.7.15 力扣每日

2020.7.15 力扣每日

 1 class Solution {
 2     public int numTrees(int n) {
 3         int[] total = new int[n + 1];
 4         total[0] = 1;
 5         total[1] = 1;
 6         for (int i = 2; i <= n; ++i) {
 7             for (int y = 1; y <= i; ++y) {
 8                 total[i] += total[y - 1] * total[i - y];
9 } 10 } 11 return total[n]; 12 } 13 }

解題思路:本題使用動態規劃的方法,題目要求求出n個節點的二叉搜尋樹。由於所有的節點為1~n的序列,且根據二叉搜尋樹的特徵,當選取了1~n中某個數,y作為根節點時,左子樹為1~y-1,右子樹則為y+1~n,且由於右子樹的排列情況與1~n-y的排列情況一致。

所以此處分別使用total[y-1],total[n-y]來表示其排列情況,也就是說當y作為根節點時,不同的二叉搜尋樹總個數為total[y-1]*total[n-y]。再利用y遍歷n,便可求出toatl[n]的狀態方程為,total[n]+=total[y-1]*total[n-y]

,y∈[1,n]。但此時仍未知total的具體值,顯然邊界情況toatl[0],total[1]的值均為1,但total[2~n]的數值未知。此時便再利用一個i遍歷n,將狀態方程中的n改為i,便可求出最終結果。

注意點:由於total需儲存0~n的情況,所以total陣列的容量為n+1,遍歷時i範圍為[2,n],y範圍為[1,i]

空間複雜度: O(n)

時間複雜度: O(n^2)

題後總結: 優:能較快的反應出使用動態規劃解決問題,且大致結構正確

差:掌握仍不熟練,對於變數的範圍,陣列的容量把握的不夠精準