1944.队列中可以看到的人数
【LetMeFly】1944.队列中可以看到的人数:(一步步图解)单调栈
力扣题目链接:https://leetcode.cn/problems/number-of-visible-people-in-a-queue/
有 n
个人排成一个队列,从左到右 编号为 0
到 n - 1
。给你以一个整数数组 heights
,每个整数 互不相同,heights[i]
表示第 i
个人的高度。
一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的,第 i
个人能看到第 j
个人的条件是 i < j
且 min(heights[i], heights[j]) > max(heights[i+1], heights[i+2], ..., heights[j-1])
。
请你返回一个长度为 n
的数组 answer
,其中 answer[i]
是第 i
个人在他右侧队列中能 看到 的 人数 。
示例 1:
输入:heights = [10,6,8,5,11,9] 输出:[3,1,2,1,1,0] 解释: 第 0 个人能看到编号为 1 ,2 和 4 的人。 第 1 个人能看到编号为 2 的人。 第 2 个人能看到编号为 3 和 4 的人。 第 3 个人能看到编号为 4 的人。 第 4 个人能看到编号为 5 的人。 第 5 个人谁也看不到因为他右边没人。
示例 2:
输入:heights = [5,1,2,3,10] 输出:[4,1,1,1,0]
提示:
n == heights.length
1 <= n <= 105
1 <= heights[i] <= 105
heights
中所有数 互不相同 。
方法一:单调栈
思路
使用一个单调递减(非递增)栈,从栈底到栈顶是越来越矮的人。
从右往左遍历身高序列,当栈顶元素小于自己时(自己可以看到这个人,并且视线不被其阻挡,自己左边的人由于自己将无法看到这人),将这人出栈,自己看到的人的个数加一。
然后自己入栈。在自己入栈前,若栈中有人(那一定比自己高)则自己能看到的人数再加一。
举例
假设身高队列为3, 4, 1, 2, 8
:
1 |
|
栈中无比8
低之人,8
入栈:
1 |
|
栈中无比2
低之人,2
入栈(入栈时栈非空,2
能看到8
)
1 |
|
栈中无比1
低之人,1
入栈(入栈时栈非空,1
能看到2
)
1 |
|
栈中1
、2
都比4
低(4
能看到1
、2
),1
、2
出栈4
入栈(入栈时栈非空,4
能看到8
)
1 |
|
栈中无比3
低之人,3
入栈(入栈时栈非空,3
能看到4
)
1 |
|
终止。3, 4, 1, 2, 8
能看到的人数分别为1, 3, 1, 1, 0
。
- 时间复杂度$O(len(heights))$
- 空间复杂度$O(len(heights))$
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135416441