题目描述
这天小明买彩票中了百亿奖金,兴奋的他决定买下蓝桥公司旁的一排连续的楼房。
已知这排楼房—共N栋,编号分别为1~N,第i栋的高度为hi。
好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出―1)。但由于楼房数量太多,小明无法用肉眼直接得到答案,于是他花了1个亿来请你帮他解决问题,你不会拒绝的对吧?
输入描述
第1行输入一个整数N,表示楼房的数量。
第⒉行输N个整数(相邻整数用空格隔开),分别为h1,h2,...,hN,表示楼房的高度。
1 <=N<=7 x10^5, 1 <=hi <=10^9。
输出描述
输出共两行。
第一行输出N个整数,表示每栋楼左边第一栋比自己高的楼的编号。
第二行输出N个整数,表示每栋楼右边第一栋比自己高的楼的编号。
输入输出样例
实例1
输入
![]()
输出
![]()
运行限制
- 最大运行时间:2s
- 最大运行内存:256M
关键代码
import os
import sys
def find_next_higher_building(N, heights):
left_first_higher = [-1] * N
right_first_higher = [-1] * N
left_stack = []
right_stack = []
# 找到左边第一个比当前楼高的楼
for i in range(N):
while left_stack and heights[i] > heights[left_stack[-1]]:
left_top = left_stack.pop()
left_first_higher[left_top] = i + 1
left_stack.append(i)
# 找到右边第一个比当前楼高的楼
for i in range(N - 1, -1, -1):
while right_stack and heights[i] > heights[right_stack[-1]]:
right_top = right_stack.pop()
right_first_higher[right_top] = i + 1
right_stack.append(i)
return left_first_higher, right_first_higher
# 输入
N = int(input())
heights = list(map(int, input().split()))
# 输出
left_first_higher, right_first_higher = find_next_higher_building(N, heights)
print(" ".join(map(str, right_first_higher)))
print(" ".join(map(str, left_first_higher)))
解题思路
使用单调栈的思想,通过维护一个栈来记录每个楼的索引,确保栈内的楼高度是单调递减的。
1481

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



