5196. 队列中可以看到的人数 单调栈
2021.7.25
对第 ii 个人来说,他能看到的人中,靠右的不能被靠左的挡住,所以这些人从左往右的高度必须是严格单调递增的。
因此可以倒序遍历 heights,用单调栈来维护人的高度,将 heights[i] 压入单调栈的同时,统计栈内比他矮的人数,压栈结束时,若栈不为空,则说明第 ii 个人还可以再看到一个人。
从后往前遍历,关键要点是:如果当前高度大于栈顶,则这个栈顶对于再往前的其他人没有贡献,可以将其弹栈。
class Solution {
public:
vector<int> canSeePersonsCount(vector<int>& heights) {
stack<int> s;
vector<int> ans(heights.size());
for(int i = heights.size() - 1; i >= 0; --i){
while(s.size() && s.top() < heights[i]){
ans[i]++;
s.pop();
}
ans[i] += !s.empty();
s.push(heights[i]);
}
return ans;
}
};