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

LeetCode 1944: Number of Visible People in a Queue

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

基本資料
#

難易度: hard 第一次嘗試:2026-09-04

  • 提交紀錄:Accepted → Accepted(隔天重打一次)

解題思路
#

第 i 個人看得到右邊的 j,條件是中間每個人都比他們兩個矮。

從右往左處理,stack 裡保持由頂到底遞增(越下面越高)。處理第 i 個人時:

  1. stack 頂端比他矮的人,他都看得到,而且這些人之後會被他擋住,左邊的人再也看不到他們,所以直接彈出、計數加 1。
  2. 彈完之後,如果 stack 還有人,那個人比他高,他也看得到,但看不到更後面的人,計數再加 1。
  3. 把他自己推進 stack。

我的解法
#

class Solution:
    def canSeePersonsCount(self, heights: List[int]) -> List[int]:
        n = len(heights)
        res = [0] * n
        stack = []
        for i in range(n - 1, -1, -1):
            count = 0
            while stack and stack[-1] < heights[i]:
                stack.pop()
                count += 1
            if stack:
                count += 1
            res[i] = count
            stack.append(heights[i])
        return res

題目保證身高都不同,所以不用處理相等的情況。

複雜度
#

時間 O(n):每個人最多進出 stack 一次。空間 O(n)。

要特別避免的錯誤
#

  • 彈完之後忘記加上「擋住視線的那個比較高的人」。
  • 從左往右做:從左往右時不知道右邊的情況,要從右往左。
  • 對每個人往右掃:O(n^2)。

面試口說整理
#

我從右往左維護一個單調棧。處理每個人時,stack 頂端比他矮的人他都看得到,而且這些人之後會被他擋住,所以直接彈出並計數;彈完如果還有人,那個比較高的人也看得到,再加 1。最後把自己推進去。每個人只進出一次,時間 O(n)。

相關文章

LeetCode 2355: Maximum Number of Books You Can Take
·2 分鐘
LeetCode Hard Dynamic-Programming Monotonic-Stack Stack Array
LeetCode 2355 解題筆記:以 i 結尾時往左每格少拿 1 本,直到碰到書比較少的瓶頸書架 j;用單調堆疊找 j,dp[i] = dp[j] + 等差數列和
LeetCode 3816: Lexicographically Smallest String After Deleting Duplicate Characters
·1 分鐘
LeetCode Hard Stack Monotonic-Stack Greedy String
LeetCode 3816 解題筆記:單調棧,頂端比較大而且還有別的副本就刪;最後把尾巴重複的也刪掉,因為前綴一定比較小
LeetCode 84: Largest Rectangle in Histogram
·1 分鐘
LeetCode Daily Hard Array Stack Monotonic-Stack Dynamic-Programming Geometry Histogram
使用單調堆疊解決直方圖中最大矩形面積問題
LeetCode 1526: Minimum Number of Increments on Subarrays to Form a Target Array
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 1526 解題筆記:從左往右看,每次比前一個高,多出來的高度都要新開那麼多次操作;變矮的部分可以沿用之前的操作
LeetCode 316: Remove Duplicate Letters
·1 分鐘
LeetCode Medium Stack Monotonic-Stack Greedy String
LeetCode 316 解題筆記:單調棧 + 最後出現位置,頂端比較大而且後面還會出現就彈掉;已經在 stack 裡的直接跳過
LeetCode 726: Number of Atoms
·2 分鐘
LeetCode Hard Stack String Hash-Map Sorting
LeetCode 726 解題筆記:先把字串切成元素、數字、括號三種 token,括號用 stack 處理,沒有數字時倍數是 1