题目描述
竞赛积分2105题号1944
思路
单调栈的小小改版。 因为题目是”每个元素的右侧能看到的人数“,所以我们最好是从右向左枚举,枚举到谁,就基本可以确定当前元素的答案了。
那么每个元素的答案怎么计算呢?以下图为例,当从右向左枚举到第一个元素时候,栈信息已经过滤了剩余的全部元素,被箭头指向的+打钩的三个元素此时在栈中。打叉的元素在枚举过程中已经淘汰出栈了。因此,当前元素的答案,应该是”pop出栈个数<打钩的元素>+pop后stk是否为空<被箭头指向的元素>“,即为3。
再换个元素,比如枚举的第一个元素的答案如何计算?此时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