Number of Visible People in a Queue - shilpathota/99-leetcode-solutions GitHub Wiki

Complexity - Hard

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 <= 105
1 <= heights[i] <= 105
All the values of heights are unique.

Solution

This is solved by Monotonic Stack We push the elements to stack as we move from right to left and compare the height with the stacked elements and increment the answer array

class Solution {
    public int[] canSeePersonsCount(int[] heights) {
        int[] output = new int[heights.length];

        Deque<Integer> st = new ArrayDeque<>();
        for(int i=heights.length-1;i>=0;i--){
            while(!st.isEmpty() && st.peek() < heights[i]){
                st.pop();
                ++output[i];
            }
            if(!st.isEmpty()){
                ++output[i];
            }
            st.push(heights[i]);
        }
        return output;
    }
}

Time Complexity - O(N) and Space complexity - O(N)

⚠️ **GitHub.com Fallback** ⚠️