239. Sliding Window Maximum
題目網址:https://leetcode.cn/problems/sliding-window-maximum/
題意:給一整數 array
nums
, 有一個大小為k
的 sliding window 從nums
的最左側移動到最右側。你只能看到 sliding window 中的k
個數字, 且 sliding window 每次只向右移一位, 返回 sliding window 中的最大值。
Solution:
想法:利用 deque。因為
window
移除元素後, 有可能會改變最大值, 故也要記錄最大值之外的值。首先, 建立遞減 Queue(Monotonic Queue), 把當前
window
中最大值的 index 放在deque
的最前面。
nums[i]
加入前, 要先不斷地和deque.back()
比較
- 若
nums[i] > nums[deque.back()]
, 則deque.pop_back()
- 若
nums[i] ≤ nums[deque.back()]
, 則將i
放入deque
最後面- 若
window
的起始位置≥ deque.front()
, 代表在下一輪deque.front()
超出window
所涵蓋的範圍, 故要 pop 掉
class Solution { |
- time:$O(n)$ ➔ 每個元素最多被 push/pop 一次
- space:$O(k)$ ➔ deque 的元素個數不超過
k
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論