class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
int n = pushed.length;
int[] s = new int[n];
int top = -1;
int idx = 0;
for (int push : pushed) {
s[++top] = push;
while (top != -1 && s[top] == popped[idx]) {
idx++;
top--;
}
}
return top == -1 && idx == n;
}
}
用一个辅助栈 与popped中的值比较
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
stack = []
i = 0
for num in pushed:
stack.append(num)
while stack and stack[-1] == popped[i]:
stack.pop(-1)
i += 1
return not stack
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
# 判空
if not pushed or not popped:
return True
stack = []
k = 0
for i in range(len(pushed)):
stack.append(pushed[i])
while len(stack) != 0 and stack[-1] == popped[k]:
stack.pop()
k += 1
return len(stack) == 0
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
A = []
j = 0
for i in pushed:
A.append(i)
while A and A[-1] == popped[j]:
A.pop()
j += 1
return len(A) == 0
初始化一个辅助栈,出栈索引 i
2.循环参数列表入栈的数组进行循环入栈
3.循环入栈的操作中按照出栈的数组元素,判断是否与栈顶元素相同,若相同则执行出栈操作,并且i++.
返回辅助栈.isEmpty();true则表示可以按照参数中的出栈顺序出栈,false就是不可以。
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack s = new Stack<>();
int i =0;
for(int num : pushed){
s.push(num);
while(!s.isEmpty()&&s.peek().equals(popped[i])){
s.pop();
i++;
}
}
return s.isEmpty();
}
}
用一个lst来接收栈底元素,lst判断是否和出栈元素相同,相同lst.pop(),否则继续循环,直到栈空 return not lst
时间复杂度O(n)
空间复杂度O(n)
class Solution(object):
def validateStackSequences(self, pushed, popped):
"""
:type pushed: List[int]
:type popped: List[int]
:rtype: bool
"""
lst1,i= [],0
for num in pushed:
lst1.append(num)
while lst1 and lst1[-1]==popped[i]:
lst1.pop()
i+=1
return not lst1
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
if(len(pushed) == 0):
return True
s = []
i = 0
for x in pushed:
s.append(x)
while s and s[-1] == popped[i]:
s.pop()
i += 1
return len(s) == 0
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
# 辅助栈 模拟入栈操作
stack = []
# popped栈的指针
i = 0
for n in pushed:
stack.append(n)
while stack and stack[-1] == popped[i]:
stack.pop()
i += 1
return not stack
共以下 61 个回答
模拟弹出过程
手动模拟
时间复杂度和空间复杂度均为O(n)
//栈模拟一下& pushed, vector & popped) { st;
class Solution {
public:
bool validateStackSequences(vector
stack
int start=0;
for(int i=0;i<pushed.size();++i){
st.push(pushed[i]);
while(!st.empty()&&popped[start]st.top()){
st.pop();
start++;
}
}
return st.empty();
};
时间复杂度O(n)空间复杂度O(n)
思路:
需要用到一个辅助栈进行,循环遍历pushed依次将其push到栈中,并循环判断是否与poped当前项一直,若一致则将将栈顶弹出pop,并递增i;若最后stack为空,则为true,不为空,则为false
● 时间复杂度:O(n)
● 空间复杂度:O(n)
循环判断与出栈,最后栈为空就证明成立
栈模拟
时间复杂度:O(n)
空间复杂度:O(n)
依次每入栈一次序列就和出栈序列进行一次对比即可
画了两遍图发现了规律,不断判断栈顶是否为 pop 序列的最头元素,来决定结下来是辅助栈是pop还是push。
时间复杂度:O(n)
空间复杂度:O(n)
1、通过临时栈来模拟入栈出栈顺序,如果最后栈空,则该顺序可行
2、时间O(n),空间O(n)
标准解法:借用辅助栈来模拟
时间:O(N)
空间:O(N)
时间复杂度:O(n)
空间复杂度:O(n)
1、先判断特殊情况,如果数组为空或者数组内元素个数为0是,直接返回true
2、利用一个for循环将元素压入栈中,每个元素压入栈中的过程中,判断栈顶元素是否与出栈顺序的元素相等,如果相等则栈中元素出栈
时间复杂度O(n) 空间复杂度O(n)
开了一个新栈o(n),时间复杂度也是o(n)
时间复杂度o(n)空间复杂度o(n)
用一个辅助栈,先按顺序将pushed中的元素入栈,入栈后判断入栈的元素是否与poped的第一个元素相同,若相同则出栈,poped后移一位,知道pushed的元素全部入栈
时间复杂度O(n) 空间复杂度O(n)
思路:
借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。
入栈操作: 按照压栈序列的顺序执行。
出栈操作: 每次入栈后,循环判断 “栈顶元素弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。
判断:最后根据该栈是否为空来判断是否是正确的压入/弹出操,为空,说明栈的出栈顺序是正确的,否则为错误的。
时间复杂的:O(n) 空间复杂的:O(n)
注意:不是等所有元素全部入栈之后再出栈,可以在入栈的某一时刻之后出栈,只要能按照出栈顺序即可
模拟栈
1. 时间复杂度:O(n)
2. 空间复杂度:O(n)
3. 代码
时间复杂度O(n)
空间复杂度也是O(n)
思路一:栈模拟。时间复杂度和空间复杂度都为O(N)。
思路二:leetcode看到的,一组合法的入栈、出栈顺序对应二叉树的前序、中序遍历。所以直接根据pushed和poped两个数组判断能否构成一颗二叉树来判断结果就行。时间复杂度的话,递归调用次数n次,每一次递归的时间复杂度O(N),所以总的时间复杂度为O(N^2),空间复杂度的话,O(N)吧。
思路三:牛客网看到的一种,因为数组类似与栈,直接用数组的下标作为栈顶的定位符,在pushed数组上修改。时间复杂度O(n),空间复杂度O(1)。
时空复杂度On
时间:O(n)
空间:O(n)
1.题目解读
由题目可知 入栈的所有数字均不相等 ,因此在循环入栈中,每个元素出栈的位置的可能性是唯一的(若有重复数字,则具有多个可出栈的位置)。因而,在遇到 栈顶元素 与弹出序列的当前元素的值相同时 就应立即执行出栈。
参考作者:jyd
思路:
2.循环参数列表入栈的数组进行循环入栈
3.循环入栈的操作中按照出栈的数组元素,判断是否与栈顶元素相同,若相同则执行出栈操作,并且i++.
模拟栈的进出,最后判断栈是否为空
时间复杂度O(N)
空间复杂度O(N)
用一个lst来接收栈底元素,lst判断是否和出栈元素相同,相同lst.pop(),否则继续循环,直到栈空 return not lst
时间复杂度O(n)
空间复杂度O(n)
剑指 Offer 31. 栈的压入、弹出序列
解法思路
使用一个足够的数组模拟栈,初始化front=rear=0,pushindex=popindex=0,pushindex用于遍历pushed序列,popindex用于遍历popped序列。
栈空时,按照pushed序列入栈;非空时,判断当前栈顶元素与当前需要出栈的元素(即popped序列中popindex指向元素)是否相同,相同则出栈并将popindex后移;不同则继续压栈。直到压栈完毕(pushed序列遍历完)。
由于pushed序列一定先于或者同时于popped序列遍历完,所以需要继续遍历popped序列,如果当前栈顶元素与popped序列中即将出栈元素不同,返回false,否则出栈直到popped序列结束。
上述过程中都没有返回false,证明正确,返回true。
时间复杂度 O(n)
相当于遍历一遍pushed序列与popped序列,所以为O(n)。
空间复杂度 O(n)
虽然这里直接定义了1001大小的数组,但是实际上与序列长度正相关,定义1001是为了解题方便。
leetcode beats
时间:100%
空间:91.21%
代码
代码实现
循环遍历并且入栈,然后判断是否和第二个数组的j位置的值相等,相等就出栈,不相等就再遍历入栈
时间O(n)
空间O(n)
算法流程:
初始化: 辅助栈 stackstack ,弹出序列的索引 ii ;
遍历压栈序列: 各元素记为 numnum ;
元素 numnum 入栈;
循环出栈:若 stackstack 的栈顶元素 弹出序列元素 popped[i]popped[i] ,则执行出栈与 i++i++ ;
返回值: 若 stackstack 为空,则此弹出序列合法。
时间复杂度:o(n)
空间复杂度:o(n)
额
用一个辅助栈,把pushed中的元素,push到辅助栈中,判断辅助栈顶元素是否与当前poped[j]相等,如果相等就进行pop操作,然后把j+1,运行完后,判断栈是否为空。
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度 O(nlogn)
解题思路:构建辅助栈,遍历pushed中的元素,并push到辅助栈中,当辅助栈栈顶元素和当前poped[j]相等时,就对辅助栈执行pop操作,并将j+1,执行完操作查看辅助栈是否为空,判断poped是否未pushed的弹出序列。
时间复杂度:O(n)
空间复杂度:O(n)
用一个栈来实现,定义一个j来定位popped【】里面的数据,即(出栈的数据)。stack为空就进行入栈操作,然后判断栈顶元素与popped【j】是否相等,相等stack出栈并且j加一(popped序列往后走),不相等就继续进行入栈操作。每次入栈操作后重复上一步。直到pushed【】遍历完。如果popped序列正确,stack就是空的,所以直接返回stack的判空方法。
时间复杂度:O(n),空间复杂度:O(n)
利用规则一个元素入栈,他之前入栈的元素的顺序的逆序的相对顺序不变,创建一个栈模拟操作,具体详细见代码,时间空间复杂度都为O(n)。
先按序入栈,并判断是否有元素符合出栈序列,如果循环结束栈为空,代表出入栈序列相符合。时间O(n),空间O(n)