【Leetcode】1944. Number of Visible People in a Queue

题目地址:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值