class Solution { public List findBuildingViewCount(int[] heights) { int n = heights.length; if (n == 1) return Collections.singletonList(0); List leftView = new ArrayList<>(); List rightView = new ArrayList<>(); int left = 0, right = n - 1; leftView.add(left); rightView.add(right); while (left < right) { if (heights[left] < heights[right]) { if (heights[left] > heights[leftView.get(leftView.size()-1)]) { leftView.add(left); } left++; } else { if (heights[right] > heights[rightView.get(rightView.size()-1)]) { rightView.add(right); } right--; } } // Merge rightView in correct order (from rightmost to leftmost) while (!rightView.isEmpty()) { leftView.add(rightView.remove(rightView.size()-1)); } return new ArrayList<>(leftView); } }