↓快轉到主要內容
  1. LeetCode/

LeetCode 281: Zigzag Iterator

·1 分鐘· ·
LeetCode Medium Queue Design Iterator
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-04-29

  • 提交紀錄:Accepted(一次通過)

解題思路
#

兩個陣列輪流各輸出一個;其中一個用完後,剩下的全部從另一個輸出。

我的解法:兩個 deque 加上輪到誰的旗標
#

def hasNext(self) -> bool:
    if self.next_pop == "v1":
        if self.queue1:
            return True
        elif self.queue2:
            self.next_pop = "v2"
            return True
        return False
    ...

hasNext 裡面順便處理「輪到的那邊已經空了,就換另一邊」。可以 AC,但兩邊的邏輯是重複的,而且 Follow-up 問「如果有 k 個陣列呢?」時就要改很多。

更好的做法:queue 裡放來源
#

queue 裡放「還有元素的來源」和它目前讀到的位置。每次 next 取出隊頭的來源,讀一個值;這個來源還有剩,就放回 queue 尾端:

from collections import deque

class ZigzagIterator:
    def __init__(self, v1: List[int], v2: List[int]):
        self.q = deque((v, 0) for v in (v1, v2) if v)

    def next(self) -> int:
        v, i = self.q.popleft()
        if i + 1 < len(v):
            self.q.append((v, i + 1))
        return v[i]

    def hasNext(self) -> bool:
        return bool(self.q)

要支援 k 個陣列,只要建構時把 k 個來源都放進 queue。hasNext 也不再有副作用。

複雜度
#

next 和 hasNext 都是 O(1),空間 O(k),不算原本的陣列。

要特別避免的錯誤
#

  • 空的陣列也放進 queue:之後 next 會讀到越界。
  • hasNext 有副作用:連續呼叫多次時,必須確保結果不變。

面試口說整理
#

我用一個 queue 存還有元素的來源和目前的位置。每次 next 從隊頭的來源取一個值,還有剩就放回尾端,這樣就自然輪流輸出,用完的來源也自動被移除。hasNext 只要看 queue 是不是空的。要推廣到 k 個陣列,只要把 k 個來源都放進 queue,每個操作都是 O(1)。

相關文章

LeetCode 3829: Design Ride Sharing System
·1 分鐘
LeetCode Medium Queue Design Hash-Map Lazy-Deletion
LeetCode 3829 解題筆記:乘客和司機各一個 queue,取消只記在 set 裡,配對前再把隊頭已取消的乘客丟掉
LeetCode 3508: Implement Router
·2 分鐘
LeetCode Medium Design Binary-Search Queue Hash-Map
LeetCode 3508 解題筆記:queue 管 FIFO、set 判重複、每個目的地一個遞增的時間陣列,查詢用 bisect
LeetCode 3885: Design Event Manager
·1 分鐘
LeetCode Medium Heap Design Hash-Map Lazy-Deletion
LeetCode 3885 解題筆記:dict 存目前優先度,max-heap 加 lazy deletion,彈出時再驗證
LeetCode 1570: Dot Product of Two Sparse Vectors
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table Array
LeetCode 1570 解題筆記:只存非零的 (index, value),內積時用雙指針合併兩個依 index 排序的列表,index 相同才相乘
LeetCode 3835: Count Subarrays With Cost Less Than or Equal to K
·1 分鐘
LeetCode Medium Sliding-Window Monotonic-Queue Queue Array
LeetCode 3835 解題筆記:花費 = (最大 - 最小) × 長度,視窗變大只會變貴,所以可以滑動視窗數子陣列;視窗最大、最小值用兩個單調佇列維護
LeetCode 244: Shortest Word Distance II
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table String Array
LeetCode 244 解題筆記:預處理每個字的出現位置(天然排序),查詢時對兩個位置列表做雙指針合併,每次移動比較小的那個