栈和排序
给你一个 1 到 n 的排列和一个栈,并按照排列顺序入栈
你要在不打乱入栈顺序的情况下,仅利用入栈和出栈两种操作,输出字典序最大的出栈序列
要求:时间复杂度 O(n),空间复杂度 O(n)Last updated
给你一个 1 到 n 的排列和一个栈,并按照排列顺序入栈
你要在不打乱入栈顺序的情况下,仅利用入栈和出栈两种操作,输出字典序最大的出栈序列
要求:时间复杂度 O(n),空间复杂度 O(n)Last updated
class Solution:
def solve(self , a: List[int]) -> List[int]:
n = len(a)
# 预处理:计算当前位置之后的最大值(不包括当前位置)
book = [0] * n
book[-1] = float('-inf')
for i in range(n - 2, -1, -1):
book[i] = max(book[i + 1], a[i + 1])
# book[i] = max(book[i + 1], a[i]) # 这样写表示包括当前位置,err
s = [] # 模拟栈
ret = [] # 保存答案
for i in range(n):
s.append(a[i])
while s and s[-1] >= book[i]: # book[i] 表示 a[i] 之后的最大值
ret.append(s.pop())
while s:
ret.append(s.pop())
return retclass Solution:
def solve(self , a: List[int]) -> List[int]:
ret = [] # 记录答案
s = [] # 模拟栈
n = len(a)
book = [0] * (n + 1) # 记录已经出现过的元素
for x in a:
s.append(x)
book[x] = 1
while n and book[n]:
n -= 1
while s and n <= s[-1]:
ret.append(s.pop())
while s:
ret.append(s.pop())
return ret