返回

深入探究 Number of Visible People in a Queue

后端

问题

「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 题目的道路上取得更大的进步!