iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

LeetCode演算法刷題 使用Go系列 第 25

Day25-[LeetCode演算法刷題 使用Go] -Pascal's Triangle II

  • 分享至 

  • xImage
  •  

題目連結: Pascal's Triangle II

題目描述為: 給定一個整數 n,要我們以陣列形式返回巴斯卡三角形的第 n 層所有數值,其中頂端為第 0 層。
題目有補充說明希望我們只使用 O(k) 的額外記憶體空間,且 n 介於 [0,40]。

例子1: n= 3, output=[1,3,3,1]。
例子2: n=0, output=[1]。
例子3: n=1, output=[1,1]。

思路 1: 動態規劃法

設 f(n)為一陣列表示巴斯卡三角形第 n 層的所有數值,且我們規定每層從第 0 個數開始,則我們有: 第 n 層第 k 個數的值為組合數 https://chart.googleapis.com/chart?cht=tx&chl=C_k%5En 。根據等式: https://chart.googleapis.com/chart?cht=tx&chl=C_k%5En%3DC_%7Bk%7D%5E%7Bn-1%7D%2BC_%7Bk-1%7D%5E%7Bn-1%7D ,因此我們要求 f(n)的值可以依次求 f(0),f(1),f(2)...直到 f(n)。此形式與 day23,day24 的解法一致。

  • 複雜度評估
    設要求的層數為 N,每層有 N+1 個數字,我們需要從最頂層開始依序求出所有的數,時間複雜度為 O(N²)。
    此方法至多需要保存第 N 層的所有數值,空間複雜度為 O(N)。

參考程式碼

func getRow(rowIndex int) []int {
    ans := make([]int, 1, rowIndex+1)
	ans[0] = 1
	if rowIndex == 0 {
		return ans
	}

	for i := 0; i < rowIndex; i++ {
		ans = append(ans, 1)
		for j := len(ans) - 2; j > 0; j-- {
			ans[j] += ans[j-1]
		}
	}

	return ans
}

小結:

巴斯卡三角形尚有一個性質為左右對稱,若充分利用此性質可使計算量減半,而時間複雜度依然為 O(N²)。
我將解法加上簡單的測試,上傳程式碼到此。

補充 :

若使用 https://chart.googleapis.com/chart?cht=tx&amp;chl=C_k%5En%3D%5Cfrac%7Bn!%7D%7Bk!(n-k)!%7D 的方式來計算組合數,則會遇到諸多問題如: 溢位,重複計算,...等,且需要做乘除運算,採用解法 1 來處理此問題明顯較佳。


上一篇
Day24-[LeetCode演算法刷題 使用Go] -House Robber
下一篇
Day26-[LeetCode演算法刷題 使用Go] -Binary Watch
系列文
LeetCode演算法刷題 使用Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言