• leetcode - 1944. Number of Visible People in a Queue


    Description

    There are n people standing in a queue, and they numbered from 0 to n - 1 in left to right order. You are given an array heights of distinct integers where heights[i] represents the height of the ith person.

    A person can see another person to their right in the queue if everybody in between is shorter than both of them. More formally, the ith person can see the jth person if i < j and min(heights[i], heights[j]) > max(heights[i+1], heights[i+2], …, heights[j-1]).

    Return an array answer of length n where answer[i] is the number of people the ith person can see to their right in the queue.

    Example 1:

    在这里插入图片描述

    Input: heights = [10,6,8,5,11,9]
    Output: [3,1,2,1,1,0]
    Explanation:
    Person 0 can see person 1, 2, and 4.
    Person 1 can see person 2.
    Person 2 can see person 3 and 4.
    Person 3 can see person 4.
    Person 4 can see person 5.
    Person 5 can see no one since nobody is to the right of them.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Example 2:

    Input: heights = [5,1,2,3,10]
    Output: [4,1,1,1,0]
    
    • 1
    • 2

    Constraints:

    n == heights.length
    1 <= n <= 10^5
    1 <= heights[i] <= 10^5
    All the values of heights are unique.
    
    • 1
    • 2
    • 3
    • 4

    Solution

    Go through from right to left, use a monotonic decreasing stack, if current element is smaller than the top, then it could see only 1 people, which is the top element in the stack. Otherwise, keep popping elements from the stacks, these are all the people the current element could see, until the top element is larger than the current element.

    Time complexity: o ( n ) o(n) o(n)
    Space complexity: o ( n ) o(n) o(n)

    Code

    class Solution:
        def canSeePersonsCount(self, heights: List[int]) -> List[int]:
            stack = []
            res = []
            for i in range(len(heights) - 1, -1, -1):
                see_cnt = 0
                while stack and stack[-1] < heights[i]:
                    stack.pop()
                    see_cnt += 1
                if stack:
                    see_cnt += 1
                stack.append(heights[i])
                res.append(see_cnt)
            return res[::-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    使用 AutoGPTQ 和 transformers 让大语言模型更轻量化
    springboot网上报销系统的设计与实现毕业设计源码131706
    2022win7cf烟雾头最新调法
    【学习笔记】最短路 +生成树
    babel原理
    【REGEXP】【正则的使用】【正则的使用】
    javascript 实现五子棋人机PK-v2
    Git教程
    【算法|动态规划No30】leetcode5. 最长回文子串
    使用vscode下载插件在线打开html界面,解决没有Open in default brower选择问题
  • 原文地址:https://blog.csdn.net/sinat_41679123/article/details/136204102