题目地址:
https://leetcode.com/problems/number-of-visible-people-in-a-queue/description/
给定一个长 n n n的正整数数组 a a a, a a a的数字各不相同。每个数字代表这个人的高度,他向右看,可以看到的人满足的条件是他们两个人之间的人都比他们俩个子矮。问每个人向右看能看到几个人。
思路是单调栈。从右向左遍历,维护一个严格单调下降的栈,加入一个数的时候,这个人如果违反了下降性质,那么pop栈顶,栈顶是这个人能看到的人,从而将答案加 1 1 1;容易知道被pop的人以后不会被看到了。除了被pop的人之外,如果栈里还有数,那么这个人比当前的人高,并且也能被看到,则答案还需要再加一次 1 1 1。代码如下:
class Solution {
public:
vector<int> canSeePersonsCount(vector<int>& hs) {
int n = hs.size();
vector<int> res(n, 0);
stack<int> stk;
for (int i = n - 1; i >= 0; i--) {
while (stk.size() && hs[i] > hs[stk.top()]) {
res[i]++;
stk.pop();
}
if (stk.size()) res[i]++;
stk.push(i);
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。