LeetCode #209 Minimum Size Subarray Sum - 刷題之旅
1 題目描述
找到一個subarray的和大於等於target,並且這個subarray的長度是最小的。
subarray是指連續非空的元素。
題目要求時間複雜度為O(N)。
2 解法
因為要找出最小長度,基本上就是找到一組window大小為最小,但是同時滿足>=target的條件。因為nums
是無序的,所以一定是要遍歷一次,因此時間複雜度是O(N)。
老樣子,Sliding Window 就是需要定義出以下狀況:
- 何時停止擴展?
- 我們希望當前的window >= target時,停止擴展
- 在還沒超過target之前,我們會一直擴展window
- right 指針會一直往右移動
- 處理當前window的時機?
- 因為接下來我們要開始收縮window找找看有沒有更小的window
- 計算當前window的總和數,以及當前window的長度是否有小於最小長度
- 何時收縮window?
- 如果發現當前window的總和數 >= target,就開始收縮window
- 移動left指針,並且更新當前window的總和數
- 當當前window的總和數 < target,就停止收縮window
1 | class Solution: |
3 總結
這題不難,但是我卡在如何要擴展window的時機,因為當初使用while來寫,但是這題不應該使用while,因為他不是two pointer從頭跟尾來縮window,他是two pointer從左到右來擴展跟收縮window。要檢查到right pointer觸底為止,所以不需要while。你也不用思考何時要right+1,因為for會處理掉這件事情。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論