DP動態規劃 深入淺出 以Pascal's Triangle II 巴斯卡三角形 II為例

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 3 分鐘
raw-image

這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。

前一題求的是整個巴斯卡三角形這一題求的是巴斯卡三角形的最後一層


再次複習Dynamic programming的解題框架,可分為三大步驟

1.定義DP狀態 [我在哪裡]

  1. 推導DP狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來]

3. 釐清DP初始狀態(也可以說是遞迴的終止條件) [第一步怎麼走,怎麼出發的]


題目敘述

題目給定高度n,要求我們造出並輸出高度為n的巴斯卡三角形最後一層

巴斯卡三角形的計算過程

巴斯卡三角形的計算過程

巴斯卡三角的計算過程

測試範例

Example 1:

Input: rowIndex = 3
Output: [1,3,3,1]

Example 2:

Input: rowIndex = 0
Output: [1]

Example 3:

Input: rowIndex = 1
Output: [1,1]

好,接著一起走過解題框架的三大步驟

1. 定義狀態 [我在哪裡]

我們可以定義DP[i] = 高度為i的巴斯卡三角形的最後一層

那麼最終DP[n]就是我們的解答,也是最後輸出結果。


2. 定義狀態轉移關係式(通則)
[我從哪裡來] => [答案從哪裡推導而來]

這題沒給,但我們可以根據題目的規定進行推導

這裡把官方網站給的動畫再貼一次,幫助大家觀察其規律

raw-image

我們可以發現,下一排的生成就是

頭部的1, 上一排去掉頭尾的內部元素兩兩相加 , 尾巴的1

例如第二排就是1, 1

第三排就是1, (1+1) , 1

第四排則是1, (1+2), (2+1), 1

依此類推,用python風格虛擬碼來表示,如下方所示

​last_row = dp( rowIndex-1 )
size = len(last_row)

return [ 1 ] + [ last_row[idx] + last_row[idx+1] for idx in range( size-1) ] + [ 1 ]

3. 釐清初始狀態(終止條件)
[第一步怎麼走,怎麼出發的]

初始條件呢?

在這題很明顯,就是高度為一的巴斯卡三角,也就是 [ 1 ]


到這裡,已經填滿解題框架的所有內容,接著我們把它轉成程式碼,

這裡以Python作為示範


Top down 程式碼

class Solution:
 def getRow(self, rowIndex: int) -> List[int]:
  
  if rowIndex == 0:
   # Base case
   return [1]
  
  else:
   # General case:
   last_row = self.getRow( rowIndex-1 )
   size = len(last_row)
   return [ 1 ] + [ last_row[idx] + last_row[idx+1] for idx in range( size-1) ] + [ 1 ]

複雜度分析

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

巴斯卡的三角形高度為O(n),底也為O(n),對應遞迴呼叫深度與每一層遞迴的計算成本。

空間複雜度:O( n )

巴斯卡的底為O(n),DP table剛好和巴斯卡的底一樣大。


學完這題,記得和前面的Pascal Triangle I 做個對照。
基本上是九成像,計算規則也是相同的喔!

前面那題要求的是高度為i的整個巴斯卡三角形
這題要求的是高度為i的巴斯卡三角形的最後一層


Reference

[1] Pythonic O( k ) space sol. based on math formula, 90%+ - Pascal's Triangle II - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Python 學習演算法-動態規劃(Dynammic Programming)動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
avatar
HataRin
2023-09-15
網頁前端工程師測試圖、文字的好幫手~「Dynamic Dummy Image Generator」及「Lipsum ge前端工程師為了讓網頁呈現在使用者面前時更加美觀,經常需要透過圖表及文字的調整達到前述美觀目的。本篇文章將分別介紹測試圖片網站「Dynamic Dummy Image Generator」及測試文字網站「Lipsum generator:Lorem Ipsum」,讓身為前端工程師或有意成為前端工程師的
Thumbnail
avatar
法洛威
2023-04-04
辰菲:DYNAMICS【此系列不涉及人格學,建基於我腦中的行為邏輯還有通靈(X)】 在我心裡辰菲很童話式愛情,兩個心思細膩的人情真意切地關心彼此,費心去瞭解對方,甚至有點把彼此當成「神」一樣存在的感覺 Even from the start... even though we've had a lot of hard
avatar
PURPLE ALIEX
2023-01-17
Html Dynamic DropDown Example 網頁輸入欄位動態改變範例網頁輸入欄位動態改變範例 Html Dynamic DropDown Example
avatar
學習 seeming
2021-10-17
後疫情時代|AI 2041|Tesla & Boston Dynamics|雜談後疫情時代來臨 打完疫苗後,開始思考並且逐漸意識到,為什麼在經過了一兩年,我們仍然無法完全擺脫疫情,回到那我們認為的正常,然而在最近看到了李開復先生與陳楸帆先生合作的一本書," AI 2041 : 遇見 10 個未來新世界“ 才漸漸感覺,其實現在就是我們的正常,書裡面的故事很有趣非常推薦大家去看看
Thumbnail
avatar
CCY
2021-08-22
Dynamics 365 Finance and operations這是關於一個Dynamics 365 Finance and operations這套Microsoft ERP系統技術顧問的筆記
Thumbnail
avatar
Ruby
2021-02-20
單曲樂評/BTS 史上最速億級點閱神曲Dynamite 之美國流行文化影響今天我們要來聊的是 Mr. 看過數一數二瘋狂的一首歌,沒錯就是剛釋出的 BTS 〈Dynamite〉,說這首瘋狂是因為短短不到半小時就突破一千萬次點閱,而且整體編曲超級精彩有趣,融合了韓國流行舞曲的閃亮感及動感,但卻也同時混入了很多 80.90 年代西洋音樂的 Disco, Funk 舞曲...
Thumbnail
avatar
Mr.生活扉頁
2021-02-01
我想買Boston Dynamics公司的股票我覺得Boston Dynamics是一家很棒的公司;他們把「大家都覺得可以做,但沒有人做出來的事情」做得很好、而且在很多基礎技術上功夫的下得非常紮實。
Thumbnail
avatar
傅瑞德
2018-09-03