小红在一条直线上部署了 n 个机房监控塔,第 i 个塔的高度为 h_i 。每个塔只向右侧观察。 从塔 i 开始,右侧的塔会按位置顺序连续进入视野。如果遇到第一座高度严格大于 h_i 的塔,该塔仍然可以被看到,但它会阻挡所有更远的塔。高度等于 h_i 的塔不会造成阻挡。如果右侧不存在更高的塔,则能一直看到队列末尾。 请计算每座塔向右能够看到的塔的数量。
第一行输入一个整数 n 。 第二行输入 n 个整数 h_1,h_2,...,h_n 。 保证 1 ≤ n ≤ 5 × 10^5 , 1 ≤ h_i ≤ 1000 。
输出 n 个整数,第 i 个整数表示第 i 座塔向右能够看到的塔数。
6 4 4 2 6 1 3
3 2 1 2 1 0
考点:栈
数据规模 n ≤ 500000 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:栈
本题切入点
每座塔向右看到的数量 = 到「第一个严格更高的塔」之间的塔数(含该更高塔):用单调递减栈从右往左扫即可 O(n),等高的塔不构成阻挡需一并计入。
后进先出的结构天然适合处理嵌套、匹配与「最近的更大/更小」问题。
思路框架(栈 通法 · 非本题专属)
实现要点:Python 用 list 当栈(append/pop);判断栈空再取栈顶。
复杂度:时间 O(n) | 空间 O(n)
该范式的通法易错点
对照本题
样例 1:输入 6 / 4 4 2 6 1 3 → 输出 3 2 1 2 1 0
前两座高度为 4 的塔都会被高度为 6 的塔阻挡;高度相同的塔不会提前截断视野。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2026年-华为-05月22号开发岗。