一魚多吃 用 巴斯卡三角的觀念,來解 三角數列和 Find Triangular Sum Leetcode #2221

更新於 2024/09/25閱讀時間約 4 分鐘

這題的題目在這裡

題目會給定我們一個陣列,並且定義了一種三角形合併的操作。

當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。

要求我們返回最後一層的答案。


測試範例:

Example 1:

raw-image
Input: nums = [1,2,3,4,5]
Output: 8
Explanation:
The above diagram depicts the process from which we obtain the triangular sum of the array.

Example 2:

Input: nums = [5]
Output: 5
Explanation:
Since there is only one element in nums, the triangular sum is the value of that element itself.

約束條件:

Constraints:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 9

演算法:

除了傳統的模擬法,逐項相加以外,其實可以觀察相加的規律。

每一個項數 對應的貢獻次數,也就是係數,剛好就是前面我們學過巴斯卡三角的係數。

巴斯卡三角係數的計算過程

巴斯卡三角係數的計算過程

為了方便教學起見,我們最後再一起取 mod 10,答案仍然保持不變,是等價的。

以[1, 2, 3, 4, 5] 為例子:

[1, 2, 3, 4, ,5]

-> [1+2, 2+3, 3+4, 4+5]

#1貢獻一次,2貢獻兩次,3貢獻兩次,4貢獻兩次, 5貢獻一次


-> [1+2+2+3, 2+3+3+4, 3+4+4+5]

#1貢獻一次,2貢獻三次,3貢獻四次,4貢獻三次, 5貢獻一次


-> [1+2+2+3 + 2+3+3+4, 2+3+3+4 + 3+4+4+5]

#1貢獻一次,2貢獻四次,3貢獻六次,4貢獻四次, 5貢獻一次


-> [1+2+2+3 + 2+3+3+4 + 2+3+3+4 + 3+4+4+5]

#1貢獻一次,2貢獻四次,3貢獻六次,4貢獻四次, 5貢獻一次


已經剩下最後一個數了,直接相加得到48

48再取mod10 得到 8

最後答案就是 8


從計算過程中可以發現,每一個項數 對應的貢獻次數,也就是係數,剛好就是前面我們學過巴斯卡三角的係數

這個範例[1,2,3,4,5],陣列長度n=5

剛好對應到 n-1這一層的二項式係數

C(4, 0), C(4,1), C(4, 2), C(4, 3), C(4, 4) = 1, 4, 6, 4, 1

呼應到 (注意粗體的部分)

#1貢獻 一次,2貢獻 四次,3貢獻 六次,4貢獻 四次, 5貢獻 一次


結論:

陣列初始長度若為n,則每一項乘上C(n-1, i), i = 0 ~ n-1,再相加,取mod10,就是三角數列最後一層的數字,也是最終答案。


程式碼:

class Solution:
 def triangularSum(self, nums: List[int]) -> int:
  
  n = len(nums)
  return sum( [ ( x * math.comb(n-1, i) ) for i, x in enumerate(nums) ] ) % 10

時間複雜度:

O(n) 逐項乘上二項式的係數,再相加,陣列總長度為O(n)

空間複雜度:

O(n) 會用到一個臨時的陣列buffer去做計算,長度為O(n)


學完這一題,記得回過頭去複習 巴斯卡三角I巴斯卡三角II,背後的觀念和原理都是相通的喔。


Reference:

[1] Python O( n^2 ) by simulation [w/ Comment] - Find Triangular Sum of an Array - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給定一個陣列,長度為n,裡面的數字都是獨一無二,落在0~n的範圍。 要求我們找出那個不見的數字 Missing Number 註: (n+1)個數字,無法同時放入n個不同的格子,必定有一個數字不見了。
題目給定兩個字串s和t,t是s隨機打散後的字串,並且在t裡面額外多加了一個字元, 要求我們找出額外多加入的那個字元。
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給定一個陣列,長度為n,裡面的數字都是獨一無二,落在0~n的範圍。 要求我們找出那個不見的數字 Missing Number 註: (n+1)個數字,無法同時放入n個不同的格子,必定有一個數字不見了。
題目給定兩個字串s和t,t是s隨機打散後的字串,並且在t裡面額外多加了一個字元, 要求我們找出額外多加入的那個字元。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
題目敘述 給定兩個字串word1和word2,每次操作時,可以有三個選項 插入一個字元 刪除一個字元 替換一個字元 請問把word1轉換成word2的最小操作次數是多少? 題目的原文敘述 約束條件 Constraints: 0 <= word1.length, word2.le
Thumbnail
題目敘述 題目會給我們兩種無限量供應的骨牌Domino 和 Tromino,形狀分別如下 題目的輸入會有一個參數n。 可以任意旋轉方向進行拼接,請問最後拼成 2 x n 長方形區域的方法數有幾種? 例如 n = 3 時,拼成2 x 3 的長方形區域有五種方法。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
Thumbnail
很多的時候,大家都會認為一些成功者,都是很聰明的。【其實不然】。 阿里巴巴的創辦人馬雲,算是一位特別傳奇人物。 其中馬雲高中畢業,參加第一次高考(大學入學考試),大家應該不敢相信其中數學考了1分。
股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
Thumbnail
說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
題目敘述 給定兩個字串word1和word2,每次操作時,可以有三個選項 插入一個字元 刪除一個字元 替換一個字元 請問把word1轉換成word2的最小操作次數是多少? 題目的原文敘述 約束條件 Constraints: 0 <= word1.length, word2.le
Thumbnail
題目敘述 題目會給我們兩種無限量供應的骨牌Domino 和 Tromino,形狀分別如下 題目的輸入會有一個參數n。 可以任意旋轉方向進行拼接,請問最後拼成 2 x n 長方形區域的方法數有幾種? 例如 n = 3 時,拼成2 x 3 的長方形區域有五種方法。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
關於一主多奴,奴寵部份也該注意什麼? 要完全站在奴寵位置思考,還是有點難😅 1.妳能夠在理解之後,打心底接受這樣的關係嗎? 這邊說的接受,不是不停洗腦自己去接受這樣的關係,而是真的能夠接受這樣的關係,理解跟接受是兩回事。 2.妳曾想過想要怎樣的同伴嗎? 因為有時候,可能是妳和她相處的時間
關於一主多奴,無論是主、奴哪方都需要注意的事項。 1.作為主人,你足夠坦誠嗎? 這邊指的坦誠,並不是指等你有了第一個奴一段時間,才突然坦承自己想要多收奴,而是一開始建立關係之前就必須告知讓奴方了解,這是義務,也是作為主人的責任。 在有第一位奴願意理解、接受之後,對後來遇到的第二位甚至往後幾位,
Thumbnail
很多的時候,大家都會認為一些成功者,都是很聰明的。【其實不然】。 阿里巴巴的創辦人馬雲,算是一位特別傳奇人物。 其中馬雲高中畢業,參加第一次高考(大學入學考試),大家應該不敢相信其中數學考了1分。
股票可以一魚多吃? 可以,我們熟知的股票,主要是做價差或領股息,但是您知道,還可以做什麼用途嗎? 假如我們不要把股票賣掉,所以不做價差,那麼股票就可以做以下用途。
Thumbnail
說過上餘裕的生活,其實和「財富自由」沒有絕對關係⋯⋯時常覺得夢想和快樂是世上最快被放棄東西,無論是現實勒緊褲袋、或成就地位束縛,是說得頭頭是道卻毫無價值,總是第一個被捨棄⋯⋯