返回
深入探究 Number of Visible People in a Queue
后端
2023-12-18 11:09:00
问题
「Number of Visible People in a Queue」这道题目的如下:
有一个队列,其中的人按照从矮到高的顺序站立。现在,我们从队列的最前面开始依次观看队列,并想知道从我们的角度看有多少人可以看到。
给你一个整数数组 heights ,其中 heights[i] 表示第 i 个人站立的高度。返回一个整数数组 answer ,其中 answer[i] 是在第 i 个人前面比他高的人数。
例如:
示例 1:
输入:heights = [10, 6, 8, 5, 11, 9]
输出:[3, 1, 2, 1, 1, 0]
解释:
- 10 是第一个可以看到的人,因为他比他前面的人(也就是没有人)都高。
- 6 是第二个可以看到的人,因为他比他前面的人(也就是 10)矮。
- 8 是第三个可以看到的人,因为他比他前面的人(也就是 10 和 6)高。
- 5 是第四个可以看到的人,因为他比他前面的人(也就是 10、6 和 8)矮。
- 11 是第五个可以看到的人,因为他比他前面的人(也就是 10、6、8 和 5)高。
- 9 是第六个可以看到的人,因为他比他前面的人(也就是 10、6、8、5 和 11)矮。
解题思路
这道题目可以归结为一个经典的数据结构问题——单调栈。单调栈是一种特殊的栈,它保证栈顶元素始终满足某种单调性。在这个问题中,我们可以使用单调栈来维护一个递增序列,每次将新元素压入栈顶时,将其与栈顶元素进行比较,如果新元素大于栈顶元素,则将栈顶元素弹出,直到栈顶元素大于或等于新元素为止。这样,我们就可以确保栈中始终保持一个递增序列。
有了单调栈,我们就可以很容易地解决这个问题。我们可以从队列的头部开始遍历,并将每个人的高度压入单调栈中。对于每个新加入的人,如果他的高度大于栈顶元素,则说明他可以看到比他高的所有人,因此他的答案为栈的大小减一。否则,他只能看到比他矮的人,因此他的答案为栈的大小。
Python 代码实现
def canSeePersonsCount(heights):
"""
:type heights: List[int]
:rtype: List[int]
"""
stack = []
ans = [0] * len(heights)
for i, height in enumerate(heights):
while stack and height >= heights[stack[-1]]:
stack.pop()
if stack:
ans[i] = i - stack[-1]
stack.append(i)
return ans
# 示例输入和输出
heights = [10, 6, 8, 5, 11, 9]
result = canSeePersonsCount(heights)
print(result) # [3, 1, 2, 1, 1, 0]
结语
通过对「Number of Visible People in a Queue」这道题目的深入分析,我们学习到了单调栈这种数据结构及其应用。单调栈是一种非常有用的数据结构,它可以帮助我们解决许多复杂的问题。希望这篇文章对您有所帮助,也祝您在解决 LeetCode 题目的道路上取得更大的进步!