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

LeetCode 3834: Merge Adjacent Equal Elements

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

基本資料
#

難易度: medium 第一次嘗試:2026-02-08

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

解題思路
#

規則:每次找最左邊的一對相鄰相同元素,換成它們的和,重複到沒有相鄰相同的為止。

直接照規則模擬,每次都要從頭找,是 O(n^2)。

用 stack 從左到右處理:stack 裡保存的是「已經處理完、沒有相鄰相同」的部分。新元素進來後,如果跟頂端相同,就合併成兩倍;合併後的值可能又跟新的頂端相同,所以要用 while 一直合併下去。

為什麼這樣跟「每次合併最左邊那一對」的結果一樣:stack 裡永遠沒有相鄰相同的元素,所以當前唯一可能相同的一對,就是剛放進來的元素和它左邊那個,而它就是最左邊的一對。

我的解法
#

class Solution:
    def mergeAdjacent(self, nums: List[int]) -> List[int]:
        stack = []
        for x in nums:
            while stack and stack[-1] == x:
                x += stack.pop()
            stack.append(x)
        return stack

原本的版本先把元素推進去,再用 while len(stack) > 1 and stack[-1] == stack[-2] 檢查,效果一樣。這裡改成在推進去之前先合併,少一次 pop 和 push。

複雜度
#

時間 O(n):每次合併都會讓元素少一個,總合併次數不超過 n。空間 O(n)。

要特別避免的錯誤
#

  • 合併一次就停:合併後的值可能又跟前一個相同,要用 while。
  • 直接照題目規則每次從頭找最左邊的一對:O(n^2)。

面試口說整理
#

我用 stack 從左到右處理,stack 裡保存的是沒有相鄰相同元素的部分。新元素跟頂端相同就合併成兩倍,合併後可能又跟新的頂端相同,所以一直合併到不同為止再推進去。因為 stack 裡永遠沒有相鄰相同,每次合併的都是最左邊那一對,結果和題目規則一致。每次合併都讓元素少一個,總共 O(n)。

相關文章

LeetCode 735: Asteroid Collision
·1 分鐘
LeetCode Medium Array Stack Simulation
LeetCode 735 解題筆記:從左到右用 stack,只有「stack 頂端往右、目前的往左」才會相撞,小的爆掉,一樣大一起爆
LeetCode 853: Car Fleet
·1 分鐘
LeetCode Daily Medium Array Stack Greedy Simulation Sorting
使用堆疊方法解決車隊問題
LeetCode 2105: Watering Plants II
·1 分鐘
LeetCode Medium Two-Pointers Simulation Array
LeetCode 2105 解題筆記:Alice 從左、Bob 從右,對撞指針模擬澆水;相遇在同一株時由水比較多的人澆
LeetCode 3819: Rotate Non Negative Elements
·1 分鐘
LeetCode Medium Array Simulation
LeetCode 3819 解題筆記:把非負數抽出來左旋 k 格,再依序放回原本非負數的位置;一個非負數都沒有時不能對 0 取模
LeetCode 1222: Queens That Can Attack the King
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 1222 解題筆記:從國王往八個方向一步一步走,每個方向第一個遇到的皇后就能攻擊;皇后放進集合方便查詢
LeetCode 3494: Find the Minimum Amount of Time to Brew Potions
·1 分鐘
LeetCode Medium Simulation Prefix-Sum Array
LeetCode 3494 解題筆記:每瓶藥先往前推出最後一位巫師的完成時間(每個人都要等自己有空),再往回扣出每位巫師的完成時間