标签:不来 出栈 入栈 temp res 元素 了解 这道题 stack
栈和排序
问题描述
给你一个由1~n,n个数字组成的一个排列和一个栈,要求按照排列的顺序入栈。如何在不打乱入栈顺序的情况下,仅利用入栈和出栈两种操作,输出字典序最大的出栈序列。
排列:指 1 到 n 每个数字出现且仅出现一次。
示例:
输入:[2,1,5,3,4]
输出:[5,4,3,1,2]
分析问题
由于我们只能使用出栈和入栈两种操作,要想使得出栈序列字典序最大,首先想到的就是令高位尽可能地大,我们出栈的时机就是:当前入栈元素若是大于之后将要入栈的元素,那么就将其出栈。当元素出栈后,还需要判断栈顶元素与之后将要入栈元素之间的大小关系,如果此时栈顶元素大于之后将要入栈的元素,那么就将其出栈,不断判断直到栈为空或条件不满足。
为了快速判断“当前入栈元素是否大于之后将要入栈的元素”,我们需要创建一个辅助数组temp,其中temp[i]表示i之后的最大元素。借助辅助数组,我们可以以O(1)的时间复杂度去判断当前入栈元素是否大于之后将要入栈的元素。
下面我们来看一下代码的实现。
import sys
class Solution:
def solve(self , a):
n=len(a)
res=[]
if n==0:
return res
stack=[]
temp=[0]*n
temp[n-1]=-sys.maxsize-1
#从右往左遍历数组a,然后取填充temp
#使得temp[i]表示i之后的最大元素
for i in range(n-2,-1,-1):
temp[i]=max(a[i+1],temp[i+1])
#遍历数组a
for i in range(0,n):
if a[i] > temp[i]: #若当前元素大于之后将要入栈的元素,将其加入结果中
res.append(a[i])
# 若栈不为空,且栈顶元素大于temp[i],
# 栈顶出栈,加入结果中
while stack and stack[-1] > temp[i]:
res.append(stack[-1])
stack.pop()
else:
stack.append(a[i])
while stack:
res.append(stack[-1])
stack.pop()
return res
该算法的时间复杂度是O(n),空间复杂度也是O(n)。
标签:不来,出栈,入栈,temp,res,元素,了解,这道题,stack 来源: https://www.cnblogs.com/cxyxz/p/15541772.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。