前綴和應用: 總和=k的子陣列有幾個 Subarray Sum Equals K_Leetcode #560

更新於 2024/01/30閱讀時間約 6 分鐘

題目敘述

題目會給我們一個輸入陣列nums,和一個指定的k值。

請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ?

例如: nums = [1,2,3], k = 3

則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3]


如果是第一次聽到或接觸前綴和prefix的同學,請先參考這篇解題教學文章,因為接下來,我們會用到前綴和的觀念去解題。

題目的原文敘述


測試範例

Example 1:

Input: nums = [1,1,1], k = 2
Output: 2

有兩個子陣列的元素總合為 k = 2
[1,1][1,1]
前兩個1 和 後兩個1

Example 2:

Input: nums = [1,2,3], k = 3
Output: 2

有兩個子陣列的元素總合為 k​ = 3
[1,2][3]

約束條件

Constraints:

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

輸入陣列nums的長度介於1~兩萬之間。

  • -1000 <= nums[i] <= 1000

每個陣列元素值界於 -1000 ~ 1000

  • -10^7 <= k <= 10^7

指定的k值介於 負一千萬~正一千萬 之間。


演算法 從第一直覺的想法,演化到進階的前綴和高速計算區間和(以前正好學過)

第一直覺的想法可能是直接用兩層迴圈去找,第一層找所有可能的左端點left,第二層找所以可能的右端點right,再計算[left, right]區間內的元素總合是否剛好=k,去累積子陣列個數。

這個想法算是暴力展開法,面對題目的陣列輸入長度高達 兩萬 個完素,暴力搜索將付出平方等級的代價,高達 10*8 等級的搜索成本,明顯會有太慢time-out超過平台限制的風險。


這邊,我們會借用前面學過透過prefix sum 來高速計算 range sum的技巧,來降低演算法的複雜度,題生程式執行效率。


一開始,先建立一個字典,鍵值是prefix sum,value則是這個prefix sum的出現次數。

接著,建造一個迴圈,從左到右,逐漸更新前綴和 prefix sum,接著檢查
prefix sum - k 這個比較小的值以前有沒有出現過?
假如有,代表已經找到子陣列=k的區間,累加子陣列=k的的出現次數

接著更新當下的prefix sum的出現次數,寫到字典裡面。

依照同樣的模式,反覆迭代。

最後,子陣列=k的的出現次數計數器的值,就是題目所求,也是最終回傳的答案


以下圖說明演算法精神,假設今天題目給的k值=6

當下我正好計算到箭頭指向的地方,目前累積的prefix sum前綴和 = S + 6

那我們就去檢查 (S + 6 - k) = S + 6 - 6 = S 這個值以前有沒有出現過?

如果有,S以前出現在淺藍色的那個格子,代表從上一次出現的地方到目前這個位置,剛好構成一組子陣列,區間內的元素總合 = k = 3 + 2 + 1 = 6

image

image



程式碼 用 前綴和 高速計算 區間和(以前正好學過)

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

複雜度分析 用 前綴和 高速計算 區間和(以前正好學過)

令n=陣列總長度

時間複雜度:

從左到右線性掃描,逐步更新prefix sum,並且寫入到字典裡面,並且動態更新子陣列=k的出現次數,所需時間為O(n)。

空間複雜度:

成本耗費在字典prefixSum_map,最多儲存n種不同的前綴和,所耗空間最大為O(n)。


關鍵知識點

建造一個迴圈,從左到右,逐漸更新前綴和 prefix sum,接著檢查
prefix sum - k 這個比較小的值以前有沒有出現過?
假如有,代表已經找到子陣列=k的區間,累加子陣列=k的的出現次數

也可以順便複習 Range Sum這題,加強鞏固關於使用 前綴和 高速計算區間和的技巧


Reference:

[1] Subarray sum Equals k, O(n) by prefix sum + hashMap

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
☆ 小弟畢業前跑去荷蘭交換一學期、因而愛上了荷蘭,嚷著要帶我們去走走看看。趁著最小的妹妹畢業之際,我們四個加上大弟的女友,半年前買好來回機票和預定住宿、以立定成團決心。隨後大家又沒入生活的忙碌中,戀愛、工作、家庭、興趣、學習.....各種重心的轉移,沒辦法單腳站立,於是時間就這樣推進、退盡,退到了
Thumbnail
這部電影的主角,就是肚臍君夢想能成為的那種.. 才華洋溢、無法取代,彷彿活在世界的中心點的人。 啊..但是 站上事業高峰、能讓大家尊稱一聲「大師」。如果用職場女強人這個標籤去形容她恐怕還落於俗套..
Step0: 有API跟合約地址 前集提要:基礎智能合約 https://app.gitbook.com/o/2Og60fxjxr8ujOJl0Uns/s/bTPJaVnpufRAdMCNcQDH/asc-ji-chu-zhi-neng-he-yao-v1 Step1:創辦Github帳號 Gith
Thumbnail
官方編輯IDE:(請收藏) remix Step1安裝 Metamask 並搞到測試用ETH幣 裝完之後開啟測試模式 設定→ 進階 → Show test networks 將節點切到 Goerli網路(因為原先的 Rinkeby 代幣難拿) 獲取開發用的測試 ETH: https://goerli
Thumbnail
〈機器的脈動〉是Netflix原創科幻動畫影集《愛 x 死 x 機器人》其中一集短片,故事改編自美國科幻小說家Michael Swanwick獲得雨果獎的同名短篇小說。主角是名太空人,在探索木衛一艾歐時遭遇事故,她孤身一人,在如夢的幻境中,和艾歐進行關於生命的辯證。
Thumbnail
〈雨中的貓〉、〈一則很短的故事〉,以及〈一個乾淨明亮的地方〉。這三篇故事皆帶有海明威的溫柔慨嘆,某種氤氳氣氛,接近費茲傑羅,但沒有他的蓬勃虛華 ── 海明威總是實心的,行文如打靶,力透紙背的子彈,最終射穿作家的肉身。
Thumbnail
貔貅可以說是家喻戶曉的招財神獸,有做成擺件、手鍊、項鍊、墜子的!但其實貔貅配戴可是有規矩的,如果亂戴不但招不了財,還可能破財。 今天就來教大家貔貅正確的佩戴方式 貔貅要戴公的還是母的?我適合哪一種?
Thumbnail
紀錄片《墜:波音大調查》是對2018、2019年波音公司生產新型飛機接連的空難事件做出調查,從過往離職員工的口吻到受難者家屬和公司管理、飛航專家的討論和華爾街股價,來說明為何波音公司從一個美國人的安全指標跌下神壇變成讓榮光不在的美國軼夢。
Thumbnail
前言 這是一個使用年報資料來做選股,並且隨時可以進場的投資策略,最重要的理論基礎是相信會有均值回歸的情況。就理論上來說,假如投入的資金夠多(三百萬以上應該就足夠了),理想情況下應該是把符合選股標準的股票都買進,但可惜的是一般人很顯然不會有這樣多的資金。所以還是要把投資標的在進一步縮小才行。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
☆ 小弟畢業前跑去荷蘭交換一學期、因而愛上了荷蘭,嚷著要帶我們去走走看看。趁著最小的妹妹畢業之際,我們四個加上大弟的女友,半年前買好來回機票和預定住宿、以立定成團決心。隨後大家又沒入生活的忙碌中,戀愛、工作、家庭、興趣、學習.....各種重心的轉移,沒辦法單腳站立,於是時間就這樣推進、退盡,退到了
Thumbnail
這部電影的主角,就是肚臍君夢想能成為的那種.. 才華洋溢、無法取代,彷彿活在世界的中心點的人。 啊..但是 站上事業高峰、能讓大家尊稱一聲「大師」。如果用職場女強人這個標籤去形容她恐怕還落於俗套..
Step0: 有API跟合約地址 前集提要:基礎智能合約 https://app.gitbook.com/o/2Og60fxjxr8ujOJl0Uns/s/bTPJaVnpufRAdMCNcQDH/asc-ji-chu-zhi-neng-he-yao-v1 Step1:創辦Github帳號 Gith
Thumbnail
官方編輯IDE:(請收藏) remix Step1安裝 Metamask 並搞到測試用ETH幣 裝完之後開啟測試模式 設定→ 進階 → Show test networks 將節點切到 Goerli網路(因為原先的 Rinkeby 代幣難拿) 獲取開發用的測試 ETH: https://goerli
Thumbnail
〈機器的脈動〉是Netflix原創科幻動畫影集《愛 x 死 x 機器人》其中一集短片,故事改編自美國科幻小說家Michael Swanwick獲得雨果獎的同名短篇小說。主角是名太空人,在探索木衛一艾歐時遭遇事故,她孤身一人,在如夢的幻境中,和艾歐進行關於生命的辯證。
Thumbnail
〈雨中的貓〉、〈一則很短的故事〉,以及〈一個乾淨明亮的地方〉。這三篇故事皆帶有海明威的溫柔慨嘆,某種氤氳氣氛,接近費茲傑羅,但沒有他的蓬勃虛華 ── 海明威總是實心的,行文如打靶,力透紙背的子彈,最終射穿作家的肉身。
Thumbnail
貔貅可以說是家喻戶曉的招財神獸,有做成擺件、手鍊、項鍊、墜子的!但其實貔貅配戴可是有規矩的,如果亂戴不但招不了財,還可能破財。 今天就來教大家貔貅正確的佩戴方式 貔貅要戴公的還是母的?我適合哪一種?
Thumbnail
紀錄片《墜:波音大調查》是對2018、2019年波音公司生產新型飛機接連的空難事件做出調查,從過往離職員工的口吻到受難者家屬和公司管理、飛航專家的討論和華爾街股價,來說明為何波音公司從一個美國人的安全指標跌下神壇變成讓榮光不在的美國軼夢。
Thumbnail
前言 這是一個使用年報資料來做選股,並且隨時可以進場的投資策略,最重要的理論基礎是相信會有均值回歸的情況。就理論上來說,假如投入的資金夠多(三百萬以上應該就足夠了),理想情況下應該是把符合選股標準的股票都買進,但可惜的是一般人很顯然不會有這樣多的資金。所以還是要把投資標的在進一步縮小才行。