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.
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Solution:
def canSeePersonsCount(self, heights: List[int]) -> List[int]:
n = len(heights)
ans = [0] * n
stk = []
for i in range(n - 1, -1, -1):
while stk and stk[-1] < heights[i]:
ans[i] += 1
stk.pop()
if stk:
ans[i] += 1
stk.append(heights[i])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Solution {
public int[] canSeePersonsCount(int[] heights) {
int n = heights.length;
int[] ans = new int[n];
Deque<Integer> stk = new ArrayDeque<>();
for (int i = n - 1; i >= 0; --i) {
while (!stk.isEmpty() && stk.peek() < heights[i]) {
stk.pop();
++ans[i];
}
if (!stk.isEmpty()) {
++ans[i];
}
stk.push(heights[i]);
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Solution {
public:
vector<int> canSeePersonsCount(vector<int>& heights) {
int n = heights.size();
vector<int> ans(n);
stack<int> stk;
for (int i = n - 1; ~i; --i) {
while (stk.size() && stk.top() < heights[i]) {
++ans[i];
stk.pop();
}
if (stk.size()) {
++ans[i];
}
stk.push(heights[i]);
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| func canSeePersonsCount(heights []int) []int {
n := len(heights)
ans := make([]int, n)
stk := []int{}
for i := n - 1; i >= 0; i-- {
for len(stk) > 0 && stk[len(stk)-1] < heights[i] {
ans[i]++
stk = stk[:len(stk)-1]
}
if len(stk) > 0 {
ans[i]++
}
stk = append(stk, heights[i])
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| function canSeePersonsCount(heights: number[]): number[] {
const n = heights.length;
const ans: number[] = new Array(n).fill(0);
const stk: number[] = [];
for (let i = n - 1; ~i; --i) {
while (stk.length && stk.at(-1) < heights[i]) {
++ans[i];
stk.pop();
}
if (stk.length) {
++ans[i];
}
stk.push(heights[i]);
}
return ans;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| impl Solution {
pub fn can_see_persons_count(heights: Vec<i32>) -> Vec<i32> {
let n = heights.len();
let mut ans = vec![0; n];
let mut stack = Vec::new();
for i in (0..n).rev() {
while !stack.is_empty() {
ans[i] += 1;
if heights[i] <= heights[*stack.last().unwrap()] {
break;
}
stack.pop();
}
stack.push(i);
}
ans
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| /**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* canSeePersonsCount(int* heights, int heightsSize, int* returnSize) {
int* ans = malloc(sizeof(int) * heightsSize);
memset(ans, 0, sizeof(int) * heightsSize);
int stack[heightsSize];
int i = 0;
for (int j = heightsSize - 1; j >= 0; j--) {
while (i) {
ans[j]++;
if (heights[j] <= heights[stack[i - 1]]) {
break;
}
i--;
}
stack[i++] = j;
}
*returnSize = heightsSize;
return ans;
}
|