物以群分 是否存在整除k的連續區間 Continuous Subarray Sum_Leetcode #523 同餘應用

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 5 分鐘

題目敘述 Continuous Subarray Sum

給定一個整數陣列,請問是否存在一段區間和能夠整除k的連續區間,而且區間長度≥2?

如果存在,返回True。

無果無解,返回False。

例如[2,5,3,1,8,6], k = 6, 其中[3,1,8]是區間和能夠整除6的連續區間,而且區間長度≥2。


測試範例

Example 1:

Input: nums = [23,2,4,6,7], k = 6
Output: true
Explanation: [2, 4] is a continuous subarray of size 2 whose elements sum up to 6.

Example 2:

Input: nums = [23,2,6,4,7], k = 6
Output: true
Explanation: [23, 2, 6, 4, 7] is an continuous subarray of size 5 whose elements sum up to 42.
42 is a multiple of 6 because 42 = 7 * 6 and 7 is an integer.

Example 3:

Input: nums = [23,2,6,4,7], k = 13
Output: false

無解,找不到區間和能夠整除​13的區間

觀察 整除與同餘的關係

題目說要找一段區間和能夠整除k的區間,而且區間長度≥2。

先關注在前半段 區間和能夠整除k的區間

區間和能夠整除k 代表 區間和是k的倍數 代表 區間和除以k餘0

換句話說 區間的頭尾除以k同餘(有相同的餘數)


示意圖

raw-image

舉一個實際的例子幫助讀者了解,假如k=6

array = [2,5,3,1,8,6]

前綴%k餘數= [2,1,4,5,1,7]

發現同餘1的地方有兩處,對應的整除k的區間為[3,1,8],區間和 = 12 可以整除 k=6


現在已經知道可以利用前綴除以k同餘的表格來找目標區間,那怎麼保障區間長度≥2呢?

也很簡單,建立一個字典,記錄這個餘數第一次出現的index。

假如之後發現同餘,拿當下的index和表格裡面的index相減,就可以知道是否區間長度≥2


演算法 字典 + 前綴和%k的餘數

建立一個字典,紀錄每個餘數第一次出現的index

從左到右掃描每個元素,每回合更新對應的前綴和%k的餘數,

假如發現同餘,拿當下的index和表格裡面的index相減,若區間長度≥2,代表找到滿足的區間,返回True。

如果掃描到最後一個元素都無解,則返回False。


程式碼 字典 + 前綴和%k的餘數

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

# use maximal integer to represent infinity
INF = sys.maxsize

# key: remainder of mod k
# value: leftmost index if we have seen this remainder before
modulo_dict = { 0:-1 }

# prefix sum of remainder mod k, initialized to 0
modulo_prefix = 0


# scan each number in input array
for i in range( len(nums) ):

# update prefix sum of remainder mod k
modulo_prefix = ( modulo_prefix + nums[i] ) % k


# check if we have seen this remainder before with index gap >= 2
if i - modulo_dict.get(modulo_prefix, INF) >= 2:
return True


# update index of current remainder if needed
if modulo_prefix not in modulo_dict:
modulo_dict[ modulo_prefix ] = i

return False

複雜度分析

時間複雜度:O(n)

從左到右依序掃描每個元素,所需時間為O(n)


空間複雜度: O(k)

前綴同餘表格最大尺寸為O(k),紀錄的是每個前綴同餘0,1,2,...,k-1第一次出現的位置。


關鍵知識點 同餘

從整除k的區間 聯想到等價於 前綴同餘相等的區間。


Reference

[1] Continuous Subarray Sum - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
340內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
正常人無法辨認出投射者?Projector(導能者/投射者)永遠不會被生活正常、思考正常、想要正常、尋找正常的人辨認出Projector。因為成為Projector與正常無關,與正常無關。
Thumbnail
avatar
守候正確邀請的PROJECTOR
2024-04-14
整合內在資源X找回自我力量 工作坊6月底,我與夥伴們即將一起舉辦一場工作坊,日期是6/20-61@台北,早上九點到下午五點。 兩天的工作坊裡面,我們規劃了各種體驗性的內容,期待讓學員們可以更真實地貼近自我、進而整合自己的生命歷程,從中提取並連結自己的力量。 我非常期待:) 報名網址分享:https://www.accupass
Thumbnail
avatar
一針
2024-03-30
整合行銷意思是什麼?弄懂一站式行銷策略與案例分享!整合行銷不僅僅是一個流行詞彙,它是現代企業實踐行銷的核心概念。本文將深入探討整合行銷的基本要素、實踐步驟,以及實際案例,讓你全面瞭解這個讓企業從眾多競爭者中脫穎而出的有效策略。整合行銷(Integrated Marketing)是一種藉由結合不同行銷渠道和方法,來實現
Thumbnail
avatar
數位知識百科
2023-10-30
正常說台語的困境|《台語解放記事》雜七雜八不負責亂聊看《台語解放記事》這本書的過程時滿有感觸,一方面是剛看完《【東歐百年史】共同體的神話》,該書講的中東歐族群與語言複雜糾結的歷史,常常讓我對照起台灣情形,也可以跟本書討論各種議題相對照,另一方面讀本書時,更加喚起了我過去的經驗。
Thumbnail
avatar
菜有蟲
2023-09-25
忠臣的敵人─袁盎評傳善惡兩分,忠的對立面必然是奸嗎? 如果晁錯被冤殺,是忠而見誅的鐵證;站在晁錯對立面的袁盎,顯然就是十惡不赦的奸臣。 套用司馬遷慣用的問句,我們也可以追問:「是邪?非邪?」
Thumbnail
avatar
田心耘
2023-09-22
【國貿】信件實例 # 12. 答應客人延後付款後續篇|解決根本問題,調整出貨方式前篇ㄤ妮答應了客人延後付款,但是追溯根本,是因為客人提前半年下的訂單狀況跟現有的庫存狀況不符合,導致有些商品很趕,有些商品庫存又太多,僅有的現金付款也無法用在刀口上,所以還是要從根本解決,問題才不會一再發生。
Thumbnail
avatar
微笑ㄤ妮
2023-01-07
Anchor Protocol美元穩定幣UST利息確定調整成動態利率Anchor Protocol美元穩定幣UST利息確定調整成動態利率
Thumbnail
avatar
小海
2022-03-24
Anchor Protocol美元穩定幣UST利息19%即將調整成動態利率?日前Luna 生態基金會 Luna Foundation Guard 在 今日於Anchor Protocol 社群發佈了一項新的解決方案,名為「動態 Anchor 利率」。
Thumbnail
avatar
小海
2022-03-02
「整存整付」儲蓄 大概的意思與範例許多理財小白(沒有任何貶義,只是充份準確描述,聽不懂「零存整付」、「整存整付」、「定期定額」和「單筆投入」的字面意義和實際差別的,文科、理科、工科背景朋友們)不清楚「整存整付」是什麼,或者,是僅僅懂得字面上的意義,但沒有真實觸感。 我們不妨用一個網頁上的「整存整付」試算工具,來真實體會了解一下。
Thumbnail
avatar
高祥輝
2021-12-01
小朋友要上幼稚園了 衣服該怎麼標示名字? 作伴統整出好撇步【衣物印章】、【衣物燙印貼】小寶貝抽到幼兒園了!下一步就是要準備上學校要用的東西 一個班級內有很多小朋友,孩子還小,一定記不清楚哪個是自己的東西,像是幼兒園制服,看上去都一樣,實在是很容易被搞混,所以老師都會請家長們在衣物上標上姓名。 但是要怎麼幫小孩的衣物標示名字呢? 作伴統整下列幾種方法  
Thumbnail
avatar
作伴 ZuoBann
2021-05-28