方法一:
1解題思路:本題使用動態規劃的方法,建立了dp陣列訪問每個點的最小路徑和,此處可以建立陣列dp[height][height],訪問對應點,**可讀性更強,但會有多餘的空間;也可建立陣列dp[height*(height+1)/2],沒有多餘空間,此處採用了第二種方法。遍歷每行的元素時,最小路徑和就為上一行對應的dp[index-i]與dp[inxe-i-1]中的較小值,加上當前位置元素的值。class
solution 21}
22for(int j = 0; j < height; j++)
26return
res;27}
28 }
注意點:
每行的第乙個與最後個元素的dp值需要特殊處理。
空間複雜度:o(n^2)n為三角形高度height
時間複雜度:o(n^2)
題後總結:
優:熟練使用了動態規劃解決問題,對於特殊情況的考慮充分
差:空間複雜度仍可優化,**也可使用math.min進行簡化
方法二:
優化:考慮到每行的dp值實際上只和上一行的dp值相關,可以設定dp[height]儲存上一行最小值的情況,進行空間複雜度的優化。同時也可採取從最後行開始,反向計算dp值,這樣就無需再次遍歷dp陣列尋找最小值了。
注意點:
如果採用從上往下遍歷時,由於dp[j]的值與dp[j-1]和dp[j]有關,如果每行從左往右遍歷,那會造成dp[j-1]資料的變更,導致結果出錯,所以需要從右往左遍歷;
採用從下往上遍歷的順序時,則相反,dp[j]與dp[j],dp[j+1]有關,就需要從左往右遍歷
1空間複雜度:o(n)n為三角形高度heightpublic
int minimumtotal(list>********) 12}
13return dp[0];
14 }
時間複雜度:o(n^2)
2020 8 4 力扣每日
儲存0入度元素 14for int i 0 i numcourses i 18while queue.isempty 26 27return count numcourses 判斷拓撲排序元素個數是否與課程數一致28 29 解題思路 根據題目中先修課程的描述,其與有向圖的構造類似,而判斷最終是否可以...
2020 7 23 力扣每日
解題思路 這是一道經典的動態規劃題目,由於移動方向為向右與向下,說明除了第一行第一列以外,其餘點的對應最小路徑和,只可能是從左移動至當前位置的路徑和,或是從上方移動至當前位置的路徑和。我們使用二維陣列dp row col 儲存所有點的對應路徑和情況。用up,left分別儲存從上,與從左的兩種情況,顯...
2020 7 21 力扣每日
解題思路 該題與先前的7.15日的每日一題相似,兩者都是不同的二叉搜尋樹,不同的是,先前只需返回總數,而該題需要返回所有的樹,但解題思路是相似的,要解決根節點的情況就要解決左右子樹的情況,這裡同樣可以使用動態規劃來實現,但此處先用遞迴來實現,便於理解。根據二叉搜尋樹的性質,顯然,i作為根節點時的左子...