【力扣roadmap】1944. 队列中可以看到的人数

17 阅读1分钟

题目描述

  • 竞赛积分2105
  • 题号1944

image.png

思路

单调栈的小小改版。 因为题目是”每个元素的右侧能看到的人数“,所以我们最好是从右向左枚举,枚举到谁,就基本可以确定当前元素的答案了。

那么每个元素的答案怎么计算呢?以下图为例,当从右向左枚举到第一个元素时候,栈信息已经过滤了剩余的全部元素,被箭头指向的+打钩的三个元素此时在栈中。打叉的元素在枚举过程中已经淘汰出栈了。因此,当前元素的答案,应该是”pop出栈个数<打钩的元素>+pop后stk是否为空<被箭头指向的元素>“,即为3。

image.png

再换个元素,比如枚举的第一个元素的答案如何计算?此时stk必为空,而且无人可以pop,所以答案就是0。

代码

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