leetcode - 1944. Number of Visible People in a Queue

文章描述了一个问题,给定一组人的身高数组,计算每个人能看到右边多少人。通过从右到左遍历,利用单调递减栈来确定每个位置的人能看到的人数。算法的时间复杂度和空间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

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.

Example 2:

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

Constraints:

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

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]
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值