DDSA
Advertisement

Maximum People Visible in a Line

Maximum People Visible in a Line.java
Java
import java.util.*;

class Solution {
    public int maxPeople(int[] arr) {
        int n = arr.length;
        int[] nextGreaterOrEqualHeightedPerson = new int[n];
        int[] previousGreaterOrEqualHeightedPerson = new int[n];

        int maxPeopleSeeByAPerson = Integer.MIN_VALUE;
        NGEE(arr, nextGreaterOrEqualHeightedPerson);
        PGEE(arr, previousGreaterOrEqualHeightedPerson);

        for (int i = 0; i < n; i++) {
            int person_i_can_see = nextGreaterOrEqualHeightedPerson[i]
                    - previousGreaterOrEqualHeightedPerson[i] - 1;
            maxPeopleSeeByAPerson = Math.max(maxPeopleSeeByAPerson, person_i_can_see);
        }
        return maxPeopleSeeByAPerson;
    }

    // find next greater or equal heighted person
    public void NGEE(int[] arr, int[] nextGreaterOrEqualHeightedPerson) {
        int n = arr.length;
        int j = n - 1;
        Stack<Integer> stack = new Stack<>();

        while (j >= 0) {
            while (!stack.isEmpty() && arr[stack.peek()] < arr[j])
                stack.pop();

            if (stack.isEmpty())
                nextGreaterOrEqualHeightedPerson[j] = n;
            else
                nextGreaterOrEqualHeightedPerson[j] = stack.peek();

            stack.push(j);
            j--;
        }
    }

    // find previous greater or equal heighted person
    public void PGEE(int[] arr, int[] previousGreaterOrEqualHeightedPerson) {
        int n = arr.length;
        int j = 0;
        Stack<Integer> stack = new Stack<>();

        while (j < n) {
            while (!stack.isEmpty() && arr[stack.peek()] < arr[j])
                stack.pop();

            if (stack.isEmpty())
                previousGreaterOrEqualHeightedPerson[j] = -1;
            else
                previousGreaterOrEqualHeightedPerson[j] = stack.peek();

            stack.push(j);
            j++;
        }
    }
}
Advertisement
Was this solution helpful?