DP動態規劃 深入淺出 以Range Sum Query Immutable 區間和 為例

閱讀時間約 6 分鐘
raw-image

題目敘述

在學習過比較基本的DP模型 費式數列爬樓梯找零錢...等之後,來看一個比較進階而且實用的DP模型,前綴和(Prefix sum),可以再加以延伸推廣,來計算 區間和(Range Sum)。


詳細的題目可在這裡看到

題目會給定一個輸入陣列,並且定義好function界面,要求我們實作出sumRange(left, right) 區間和的功能。


測試範例

Example 1:

Input
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
Output
[null, 1, -1, -3]

Explanation
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return (-2) + 0 + 3 = 1
numArray.sumRange(2, 5); // return 3 + (-5) + 2 + (-1) = -1
numArray.sumRange(0, 5); // return (-2) + 0 + 3 + (-5) + 2 + (-1) = -3

約束條件

Constraints:

  • 1 <= nums.length <= 10^4

輸入陣列長度介於1 ~ 10^4 之間。

  • -10^5 <= nums[i] <= 10^5

每個陣列元素界於 -10^5 ~ 10^5 之間。

  • 0 <= left <= right < nums.length

動態測試給的區間一定是合法區間。

  • At most 10^4 calls will be made to sumRange.

動態測試時,最多有10^4次函式呼叫。


同樣地,先走過一遍解題框架可分為三大步驟,藉此鞏固解題基礎。

定義狀態 [我在哪裡]

我們可以透過前綴和Prefix sum,來間接求出 區間和Range sum

令PrefixSum[0] = nums[0]

PrefixSum[i] = nums[0] + nums[1] + ... +nums[i] 從第0項~第i項的總和



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

PrefixSum 前綴和本身的狀態轉移如下

PrefixSum[i]

= nums[0] + nums[1] + ... +nums[i] 從第0項~第i項的總和

= PrefixSum[i-1] +nums[i]

= [ 從第0項~第(i-1)項的總和 ]+第i項

= 從第0項~第i項的總和


raw-image

接著,可以根據定義推導出

RangeSum(left, right) 區間[left, right]的元素總和

= PrefixSum( right ) - PrefixSum( left - 1 )

= nums[left] + nums[left+1] + ... + nums[right]

留意邊界索引的處理


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

PrefixSum 前綴和的初始條件就是第0項 = PrefixSum[0] = nums[0]


RangeSum 區間和呢?

類似的,邊界條件也發生在left = 0的時候,這時候左邊已經沒有別的元素了,

此時,PrefixSum[right] = RangeSum(left, right)

直接返回 PrefixSum[right] 即可


程式碼

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, left: int, right: int) -> int:
  

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

複雜度分析

時間複雜度:

O( n ) : init() 初始化的時候,需要計算PrefixSum的表格
O( 1 ) : sumRange(left, right),直接查表,做個減法,就可以得到區間和的答案。

空間複雜度:

O( n ) : init() 初始化的時候,需要建立PrefixSum的表格,長度為O(n)
O( 1 ) : sumRange(left, right),直接查表,就可以得到區間和的答案。


Reference:

[1] Python/JS/Go/C++ by prefix sum. [ With explanation ] - Range Sum Query - Immutable - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
Thumbnail
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
Thumbnail
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
Thumbnail
Christian Yu ,1990 年出生於澳洲的韓國人,單親家庭長大,十八歲首創作自己的 Youtube 視頻。他在大學時曾修讀科學和藝術,看來他沒有唸到畢業。在青少年時期被診斷出患有「雙相情感障礙」。退學後移居韓國發展, 他本來是「街頭藝術者」,由於舞技出色,被星探所發掘,在 2012
Thumbnail
這篇文章是給想要踏出創新舞台的你。 在你的創新之旅中,你可能面臨許多不確定的問題,或是缺乏具體的創新方向。這篇文章將為你提供一種新的視角。 我將分享我在創新旅程中,結合科學、工程與營運三大元素的洞見,這也是我在這場創新旅程中獲得的三個重要體悟。 體悟1 - 學習科學家的探索精神:科學家的工作就是減少
Thumbnail
📷 昨(17)日下午3點左右,在新北市樹林區光興街157巷4號,發生一起道路塌陷意外。根據區公所消息,區域內坍塌範圍長度約17米,高度約3米,面積約51平方公尺(約16坪),坍塌處下方住戶,無人受傷。現場交通維護人員進駐,引導車輛通行。區公所已安排收容安置3户8人至旅社。這起道路塌陷意外,連帶影響
近年房市推案量龐大,興建中工地不少,上個月幾宗建案因施工緣故導致周邊道路坍方,工程品質引發民眾疑慮。不過,根據現行法規,已購客並無法以此為理由要求取消合約。 📷 建案施工造成周邊道路塌陷,出現2個大坑洞。圖/新竹縣政府 🏡更多預售屋的都會傳說,都在全台16個在地社團~ 延伸閱讀:
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
Thumbnail
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
Thumbnail
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
Thumbnail
Christian Yu ,1990 年出生於澳洲的韓國人,單親家庭長大,十八歲首創作自己的 Youtube 視頻。他在大學時曾修讀科學和藝術,看來他沒有唸到畢業。在青少年時期被診斷出患有「雙相情感障礙」。退學後移居韓國發展, 他本來是「街頭藝術者」,由於舞技出色,被星探所發掘,在 2012
Thumbnail
這篇文章是給想要踏出創新舞台的你。 在你的創新之旅中,你可能面臨許多不確定的問題,或是缺乏具體的創新方向。這篇文章將為你提供一種新的視角。 我將分享我在創新旅程中,結合科學、工程與營運三大元素的洞見,這也是我在這場創新旅程中獲得的三個重要體悟。 體悟1 - 學習科學家的探索精神:科學家的工作就是減少
Thumbnail
📷 昨(17)日下午3點左右,在新北市樹林區光興街157巷4號,發生一起道路塌陷意外。根據區公所消息,區域內坍塌範圍長度約17米,高度約3米,面積約51平方公尺(約16坪),坍塌處下方住戶,無人受傷。現場交通維護人員進駐,引導車輛通行。區公所已安排收容安置3户8人至旅社。這起道路塌陷意外,連帶影響
近年房市推案量龐大,興建中工地不少,上個月幾宗建案因施工緣故導致周邊道路坍方,工程品質引發民眾疑慮。不過,根據現行法規,已購客並無法以此為理由要求取消合約。 📷 建案施工造成周邊道路塌陷,出現2個大坑洞。圖/新竹縣政府 🏡更多預售屋的都會傳說,都在全台16個在地社團~ 延伸閱讀: