合縱連橫: 從區間和應用理解 前綴和 的本質

閱讀時間約 10 分鐘


這篇文章,會帶著大家複習以前學過的前綴和框架

並且以區間和的概念與應用為核心,

貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。


前綴和 prefix sum框架 與 區間和計算的關係式

raw-image

詳細的推導過程可參考這部教學影片


接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目
(請讀者、或觀眾留意上面的這種 前綴和 框架,之後的解說會反覆出現)

Range Sum Query - Immutable 一維的區間和

基本上就是前綴和框架的標準應用,直接使用推導出來的區間和關係式即可。


由前綴和快速計算一維的區間和

class NumArray:

def __init__(self, nums: List[int]):

self.size = len(nums)


# build prefix sum table when input nums is valid
self.s = [ 0 for _ in range(self.size) ]

self.s[0] = nums[0]

# s[k] = nums[0] + ... + nums[k]
# s[k] = s[k-1] + nums[k]
for k in range(1,self.size):
self.s[k] = self.s[ k-1 ] + nums[ k ]


def sumRange(self, i: int, j: int) -> int:


# lookup table from prefix sum table, s
if i == 0:
return self.s[ j ]
else:
return self.s[ j ]-self.s[ i-1 ]

好,接下來看一個推廣應用

Find Pivot Index 尋找左右平衡的軸心點

題目要求我們找出index i 使得 A[0] + ... A[i-1] = A[i+1] + ... + A[n]

也就是左右平衡的軸心點位置。

等價於 A[0, i-1] 的區間和 = A[i+1, n]的區間和

既然我們已經知道任意給定區間的區間和快速計算方式,那這邊也是同樣道理。

建立前綴和表格,接著用前綴和表格查表計算左區間和 與 右區間的和
當兩者相等時,當下的index i 就是平衡軸心點


由前綴和快速計算兩個一維的區間和

class Solution:
def pivotIndex(self, nums: List[int]) -> int:

# s = prefix sum of array
# s[i] = nums[0] + nums[1] + ... + nums[i]
s = list( itertools.accumulate(nums) )
total_sum = sum( nums )

# Linear scan on each index
for i in range( len(nums) ):

left_sum = s[i-1] if i >= 1 else 0
right_sum = total_sum - s[i]

# Find pivot index from definition
if left_sum == right_sum:
return i

return -1

再來看一個進階應用。

Subarray sum Equals k

題目問有多少個子陣列,他們的區間和恰好=k。

那這題就會用到之前學會的技巧,用前綴和去高速計算區間和

並且額外運用一個觀念:
如果前綴和S,與S+k都曾經出現過,代表必定存在某個區間,他們的區間和恰好為k

還有另一個等價的說法,

如果前綴和S,與S - k都曾經出現過,代表必定存在某個區間,他們的區間和恰好為k

範例與示意圖:

image

image


搭配字典與前綴和的解題程式碼:

from collections import defaultdict

class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:

# prefix sum
cur_prefix_sum = 0

# counter of subarray with sum = k
counter = 0

# key: subarray prefix sum
# value: occurrence of given prefix sum
prefixSum_map = defaultdict(int)

# prefix summation 0 is reached by selecting nothing
prefixSum_map[0] = 1

for number in nums:

# update prefix sum from first element to current position
cur_prefix_sum += number

# if curPrefixSum - k exist in map, then sub array with sum = k must exist in somewhere
if (cur_prefix_sum - k) in prefixSum_map:
counter += prefixSum_map[cur_prefix_sum - k]

# update occurrence of curPrefixSum
prefixSum_map[cur_prefix_sum] += 1

return counter

同樣的觀念推廣到二維區間和的計算,也是可以的唷!

raw-image


給個具體的例子幫助理解 (下圖來自wiki)

image

image

對應的例題就是

Range Sum Query 2D - Immutable 二維的區間和

類似的操作,一樣是先建立前綴和表格,接著查表快速計算指定範圍的二維區間和。

class NumMatrix:

def __init__(self, matrix: List[List[int]]):

if not matrix:
# Reject empty matrix
return

# get height and width of matrix (also known as image)
h, w = len(matrix), len(matrix[0])

# build integral image by recurrence relationship
self.integral_image = [ [ 0 for _ in range(w) ] for _ in range(h) ]

for y in range(h):

summation = 0

for x in range(w):

summation += matrix[y][x]
self.integral_image[y][x] = summation

if y > 0:
self.integral_image[y][x] += self.integral_image[y-1][x]

return

def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:

bottom_right = self.integral_image[row2][col2]
bottom_left = self.integral_image[row2][col1-1] if col1 >= 1 else 0
top_right = self.integral_image[row1-1][col2] if row1 >= 1 else 0
top_left = self.integral_image[row1-1][col1-1] if col1 >= 1 and row1 >=1 else 0

return bottom_right - bottom_left - top_right + top_left


結語

好,今天一口氣介紹了最精華的部分,

通用的前綴和框架,還有相關的區間和衍伸題與演算法建造,


希望能幫助讀者、觀眾徹底理解它的原理,

並且能夠舉一反三,洞察其背後的本質和了解相關的應用領域!


感謝收看囉! 我們下篇文章再見~

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這篇文章,會帶著大家複習以前學過的FSM+DP框架, 並且以有限狀態機 + DP狀態轉移的概念為核心, 貫穿一些相關聯最佳股票買賣系列的題目, 透過框架複現來幫助讀者理解這個實用的演算法框架。 基本的FSM + DP 框架,配合交易邏輯。 針對每一天,其實歸根究柢只有兩種狀態。 第一種
最近會試著寫一些統整類的文章, 幫助讀者、觀眾整理、吸收、複習已經學習到的演算法框架。 找零錢框架 在以前學過的題目中,我們已經學會了考零錢的抽象思考邏輯與框架,就是試著用每一種銅板去湊出n元(也就是找零錢的過程) 寫成虛擬碼或演算法,找零錢用了幾枚銅板可以這樣表達 # 銅板數目累加​
題目敘述 給定一個正整數n,請找出最少用幾個完全平方數,可以讓他們的總和為n? 例如 n=12,最少用3個完全平方數就可讓他們的總和為n,因為12 = 4 + 4 + 4 題目的原文敘述 測試範例 Example 1: Input: n = 12 Output: 3 Explanat
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
這篇文章,會帶著大家複習以前學過的FSM+DP框架, 並且以有限狀態機 + DP狀態轉移的概念為核心, 貫穿一些相關聯最佳股票買賣系列的題目, 透過框架複現來幫助讀者理解這個實用的演算法框架。 基本的FSM + DP 框架,配合交易邏輯。 針對每一天,其實歸根究柢只有兩種狀態。 第一種
最近會試著寫一些統整類的文章, 幫助讀者、觀眾整理、吸收、複習已經學習到的演算法框架。 找零錢框架 在以前學過的題目中,我們已經學會了考零錢的抽象思考邏輯與框架,就是試著用每一種銅板去湊出n元(也就是找零錢的過程) 寫成虛擬碼或演算法,找零錢用了幾枚銅板可以這樣表達 # 銅板數目累加​
題目敘述 給定一個正整數n,請找出最少用幾個完全平方數,可以讓他們的總和為n? 例如 n=12,最少用3個完全平方數就可讓他們的總和為n,因為12 = 4 + 4 + 4 題目的原文敘述 測試範例 Example 1: Input: n = 12 Output: 3 Explanat
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
連載 戰國縱橫門派:鬼谷稗闔 -- 蘇秦篇 : 全球各地的華人在追本溯源的文化底蘊中只能透過春秋戰國的百家思想遠遠的觀望人生所追求的答案,找尋失落已久的獨立自主意識和自由思想。但認清自己真實的一面是不容易的,能看明白世間一切問題的解決能力更不容易。
Thumbnail
藍白合破局後,各黨也陸續公布其總統候選人副手。而國民黨侯友宜與趙少康組成的「侯康配」民調卻讓人難以信服,看看兼任中廣董事長以及總經理的趙少康,再看看國民黨水漲船高的民調,引起外界質疑民調淪為政媒操作下的產物。
Thumbnail
2023年4月5日至8日,❙法國❙ 總統 ❙馬克龍❙ 對 ❙中華人民共和國❙ 進行國事訪問,期間有關應該避免陷入 ❙中美❙ 在 ❙台灣❙ 問題上的對抗的言論在西方政界引起軒然大波。 準確地說,❙馬克龍❙ 的 ❙歐洲❙「戰略自主」論調並非在國事訪問期間發表的,而是在國事訪問後,在飛回 —— 途經廣州
Thumbnail
話說商鞅被車裂後,秦惠王恨他歸恨他,但卻很理智,商鞅的一系列方針政策繼續沿用。 因為他發現商鞅打造的這臺國家機器太好用了,短短二十年的時間,秦國從被看不起的西戎小國到被周天子官方封為西部大總管,這種感覺太美妙了。 一碼歸一碼的處理方法,顯示出了秦惠王的政治水平。 政治,是一種需要極高理性的遊戲,還是
Thumbnail
在台北市中心街弄中有許多藝術機構,這些藝術機構不論是畫廊、美術館、藝術教室、藝文空間、博物館等多種形式存在。從這些藝術機構更扮演著社會大眾與藝術接觸機會。長流美術館算是台灣藝術機構之先進機構,憑藉著長流機構背景讓藝術深入社會大眾心中。 長流美術館相關資訊:: 地址: 台北市大安區仁愛路二段63號B1
Thumbnail
唉!這陣子我太常在公司嘆氣,我無法要求別人一定要進步,但每個人的職位就要做好該職位的工作內容,不是嗎? 有些人並不是這樣子想,領多少薪水做多少事是應該的,其實大家都是在工作賺錢,想想你的職位是什麼,該做就要做,不是應該的嗎? 客服工作不就是要熟悉系統,去了解客戶的問題點在哪,進而回答客戶的問題,這不
Thumbnail
時隔多年,看到網飛(Netflix)將這部電影購入旗下著實是一種驚喜! 一個外貌看似九歲其實實際年齡早已三十有餘的偽蘿莉處心積慮機關算盡搶奪當家女主人大位的奮鬥史(無誤),我先把孤兒怨劇情的主體告訴各位,因為這部片的梗其實不難猜而且也不新鮮,比較讓我覺得有趣的是孤兒怨除了有鮮血、屍體、嚇人橋段之外,
Thumbnail
《NBA 2K20》發售以來應該不少玩家發現了一個奇妙的現象,許多充滿權威性的評分媒體都給予了中高以上的分數,但玩家這頭卻連 1 分都捨不得給。當然,我們無法得知或是去揣測那些給高分媒體是不是真的覺得遊戲好玩,至少在玩家們一致性的評論中,可以得知這款遊戲確實出了某種問題。
Thumbnail
歷史記載,所謂「合縱」又稱「合從」也就是聯合幾個較弱的國家對抗強大的秦國,巧合的是 alliance ㄧ字竟然也可能「alliance = a.ll.i.an.ce = 合.人人.以.anti.cina = 合.从.以.反.秦 = 合.從.以.反.秦 = 合從以反秦 = 合縱以反秦」或 ......
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
連載 戰國縱橫門派:鬼谷稗闔 -- 蘇秦篇 : 全球各地的華人在追本溯源的文化底蘊中只能透過春秋戰國的百家思想遠遠的觀望人生所追求的答案,找尋失落已久的獨立自主意識和自由思想。但認清自己真實的一面是不容易的,能看明白世間一切問題的解決能力更不容易。
Thumbnail
藍白合破局後,各黨也陸續公布其總統候選人副手。而國民黨侯友宜與趙少康組成的「侯康配」民調卻讓人難以信服,看看兼任中廣董事長以及總經理的趙少康,再看看國民黨水漲船高的民調,引起外界質疑民調淪為政媒操作下的產物。
Thumbnail
2023年4月5日至8日,❙法國❙ 總統 ❙馬克龍❙ 對 ❙中華人民共和國❙ 進行國事訪問,期間有關應該避免陷入 ❙中美❙ 在 ❙台灣❙ 問題上的對抗的言論在西方政界引起軒然大波。 準確地說,❙馬克龍❙ 的 ❙歐洲❙「戰略自主」論調並非在國事訪問期間發表的,而是在國事訪問後,在飛回 —— 途經廣州
Thumbnail
話說商鞅被車裂後,秦惠王恨他歸恨他,但卻很理智,商鞅的一系列方針政策繼續沿用。 因為他發現商鞅打造的這臺國家機器太好用了,短短二十年的時間,秦國從被看不起的西戎小國到被周天子官方封為西部大總管,這種感覺太美妙了。 一碼歸一碼的處理方法,顯示出了秦惠王的政治水平。 政治,是一種需要極高理性的遊戲,還是
Thumbnail
在台北市中心街弄中有許多藝術機構,這些藝術機構不論是畫廊、美術館、藝術教室、藝文空間、博物館等多種形式存在。從這些藝術機構更扮演著社會大眾與藝術接觸機會。長流美術館算是台灣藝術機構之先進機構,憑藉著長流機構背景讓藝術深入社會大眾心中。 長流美術館相關資訊:: 地址: 台北市大安區仁愛路二段63號B1
Thumbnail
唉!這陣子我太常在公司嘆氣,我無法要求別人一定要進步,但每個人的職位就要做好該職位的工作內容,不是嗎? 有些人並不是這樣子想,領多少薪水做多少事是應該的,其實大家都是在工作賺錢,想想你的職位是什麼,該做就要做,不是應該的嗎? 客服工作不就是要熟悉系統,去了解客戶的問題點在哪,進而回答客戶的問題,這不
Thumbnail
時隔多年,看到網飛(Netflix)將這部電影購入旗下著實是一種驚喜! 一個外貌看似九歲其實實際年齡早已三十有餘的偽蘿莉處心積慮機關算盡搶奪當家女主人大位的奮鬥史(無誤),我先把孤兒怨劇情的主體告訴各位,因為這部片的梗其實不難猜而且也不新鮮,比較讓我覺得有趣的是孤兒怨除了有鮮血、屍體、嚇人橋段之外,
Thumbnail
《NBA 2K20》發售以來應該不少玩家發現了一個奇妙的現象,許多充滿權威性的評分媒體都給予了中高以上的分數,但玩家這頭卻連 1 分都捨不得給。當然,我們無法得知或是去揣測那些給高分媒體是不是真的覺得遊戲好玩,至少在玩家們一致性的評論中,可以得知這款遊戲確實出了某種問題。
Thumbnail
歷史記載,所謂「合縱」又稱「合從」也就是聯合幾個較弱的國家對抗強大的秦國,巧合的是 alliance ㄧ字竟然也可能「alliance = a.ll.i.an.ce = 合.人人.以.anti.cina = 合.从.以.反.秦 = 合.從.以.反.秦 = 合從以反秦 = 合縱以反秦」或 ......