Every day a Leetcode
题目来源:1944. 队列中可以看到的人数
解法1:单调栈
从右往左遍历数组 heights,如果发现一个 heights[k] 比右边的数 heights[j] 大,那么 heightsh[k] 就把 heights[j]「挡住」,k 左边的人再也不会看到 j 了。
我们用一个单调栈维护没有被挡住的人的身高。对于那些被挡住的人,永远不会去遍历他们了(及时去掉无用数据)。
示例1:

从右往左遍历到 i 时,如果栈顶比 heights[i] 小,就不断弹出栈顶,直到栈为空或者栈顶大于 heights[i]。统计弹出的元素个数,作为 i 能看到的人数 ans[i]。出栈结束后,若栈不为空,说明第 i 个人还可以再看到一个人(栈顶),把 ans[i] 加一。
对于比栈顶更靠右的人,由于栈顶比 heights[i] 大,根据题目要求,i 无法看到比栈顶更靠右的人,所以无需遍历这些更靠右的人。
代码:
/*
* @lc app=leetcode.cn id=1944 lang=cpp
*
* [1944] 队列中可以看到的人数
*/
// @lc code=start
class Solution
{
public:
vector<int> canSeePersonsCount(vector<int> &heights)
{
// 特判
if (heights.empty())
return {};
stack<int> stk;
int n = heights.size();
vector<int> ans(n, 0);
for (int i = n - 1; i >= 0; i--)
{
int count = 0;
while (!stk.empty() && stk.top() < heights[i])
{
stk.pop();
count++;
}
if (!stk.empty())
count++;
stk.push(heights[i]);
ans[i] = count;
}
return ans;
}
};
// @lc code=end
结果:

复杂度分析:
时间复杂度:O(n),其中 n 是数组 heights 的长度。
空间复杂度:O(n),其中 n 是数组 heights 的长度。
文章介绍了如何使用单调栈算法解决LeetCode问题1944,通过从右向左遍历数组,计算每个人能看到其他人的数量,时间复杂度为O(n),空间复杂度也为O(n)。
767

被折叠的 条评论
为什么被折叠?



