“`java
class Solution{
public boolean validateStackSequences(int [] pushed, int [] popped){
if(pushed == null || pushed.length<=0){
return true;
}
int k = 0;
Stack stack = new Stack();辅助栈
for(int i = 0; i
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
i, j = 0, 0
stack = []
for num in pushed:
stack.append(num)
i += 1
# 与stack比较 而不是pushed
while i > 0 and stack[i - 1] == popped[j]:
j += 1
i -= 1
stack.pop()
return not stack
共以下 49 个回答
“`java stack = new Stack ();
使用栈
class Solution {
public boolean validateBookSequences(int[] putIn, int[] takeOut) {
Stack
int takeIndex = 0;
for (int i = 0; i< putIn.length; i++) { if (takeOut[takeIndex] != putIn[i]) { stack.push(putIn[i]); continue; } takeIndex++; while (!stack.isEmpty() && stack.peek() == takeOut[takeIndex]) { stack.pop(); takeIndex++; } } return stack.isEmpty(); } }
“` java stack = new Stack<>();
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack
int k = 0;
for(int i=0;i
}}
借助辅助栈实现
时间:O(n)
空间:O(n)
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
if(pushed null || pushed.length 0){
return true;
}
}
时间复杂度O(n)
空间复杂度O(n)
“`java stack = new Stack();辅助栈
class Solution{
public boolean validateStackSequences(int [] pushed, int [] popped){
if(pushed == null || pushed.length<=0){ return true; } int k = 0; Stack
for(int i = 0; i
时间复杂度:O(N) 空间复杂度:O(N)
通过一个栈来模拟出入栈,如果最后模拟栈空的话就是可用序列,否则就不可用
【思路】定义一个栈,按pushed顺序push,如果碰到可以pop的就pop,最后push完之后如果pop不了了就失败,pop完了就成功
【时间复杂度】O(n)
【空间复杂度】O(n)
这是一道经典的栈的问题。我们可以使用一个辅助栈来模拟栈的压入和弹出操作。
具体步骤如下:
1. 初始化一个空栈和弹出序列的索引i。
2. 遍历压入序列,将元素依次压入栈中。
3. 每次压入元素后,判断栈顶元素是否与弹出序列的当前元素相等。如果相等,则将栈顶元素弹出,并将弹出序列的索引i加1。
4. 最后,如果栈为空且弹出序列的索引i等于弹出序列的长度,则说明弹出序列是压入序列的一个合法弹出序列;否则,不是合法弹出序列。
下面是具体的实现代码:
时间复杂度分析:
– 遍历压入序列的时间复杂度为O(N),其中N为序列的长度。
– 在每次压入元素后,可能需要弹出栈顶元素,因此弹出操作的时间复杂度为O(N)。
– 因此,总的时间复杂度为O(N)。
空间复杂度分析:
– 使用了一个辅助栈,最坏情况下,辅助栈的空间复杂度为O(N)。
– 因此,总的空间复杂度为O(N)。
时间复杂度O(N), 空间复杂度O(N)
时间复杂度O(n),控件复杂度O(n)
辅助栈
时间复杂度是O(n) 空间复杂度是O(n)
class Solution {& pushed, vector & popped) { stack;
public:
bool validateStackSequences(vector
if(pushed.size()!=popped.size()){
return false;
}
stack
int push = 0;
int pop = 0;
while(push<pushed.size()){
stack.push(pushed[push]);
while(!stack.empty()&&stack.top()popped[pop]){
stack.pop();
pop++;
}
push++;
}
while(!stack.empty()&&stack.top()popped[pop]){
stack.pop();
pop++;
}
return stack.empty();
}
};
时间复杂度O(N),空间复杂度O(N)
时间复杂度O(N)
空间复杂度O(N)
Problem: 剑指 Offer 31. 栈的压入、弹出序列
复杂度
Code
时间复杂度:O(n)
额外空间复杂度:O(n)
栈的弹入弹出,,做法就是模拟!!
入栈,看栈头是否是当前弹出序列位置上的数,是则出栈,循环判断。当栈为空或者栈头并非弹出序列对应数的时候,再重启入栈操作
最后如果栈为空则模拟成功
时间复杂度 O(n) 空间复杂度 O(n)
···cpp& pushed, vector & popped) { s;
// c++实现
class Solution {
public:
bool validateStackSequences(vector
stack
int j=0;
for(int i=0;i<pushed.size();i++){
s.push(pushed[i]);
// 注意判空
while(!s.empty() && s.top() popped[j]){
s.pop();
j++;
}
}
return s.empty();
}
};
循环压栈序列,遇到栈顶元素等于弹出序列的当前元素则执行出栈,循环结束栈中如果还有元素则说明无法按照弹出序列的顺序弹出
”’C
//学习的一个高分java题解的老哥写的,空间是O(1)的,不过本质上是循环使用了pushed数组
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
int top=-1, p=0;
for(int i=0;i<poppedSize;i++){
int e=popped[i];
if(top>-1 && pushed[top]e){
top–;
continue;
}
while(p<pushedSize && pushed[p]!=e){
pushed[++top]=pushed[p++];
}
if(ppushedSize) return false;
p++;
}
return true;
}”’
C++实现
嗯,,就先把题目弄懂吧,唉
”’C++实现& pushed, vector & popped) { s;
class Solution {
public:
bool validateStackSequences(vector
int a=0,b=0;
stack
while(a<pushed.size()){
if(pushed[a]popped[b])
{
a++,b++;
}
else
{
if(!s.empty()&&s.top()popped[b])
{
s.pop(),b++;
}
else
{
s.push(pushed[a]),a++;
}
}
}
while(!s.empty())
{
if(s.top()!=popped[b])
{
return false;
}
s.pop(),b++;
}
return true;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
“`py
辅助栈
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
lst = []
idx = 0
for x in pushed:
lst.append(x)
while lst and lst[-1] == popped[idx]:
lst.pop()
idx += 1
return not lst
““
模拟
时间:O(n)
空间:O(n)
C++
TC: O(n)
SC: O(n)
模拟就行,思路跟帅地题解一样
时空复杂度:O(n)
1、先判断入栈数组是否为空
2、建立辅助栈,循环将入栈元素压入栈中,同时从头开始将出栈数组与栈顶指针比较,若相同且栈内有数据,则栈出栈,并且出栈数组指针加1
3、到最后如果栈为空,则测试的出栈顺序成立
时间复杂度是O(n)
空间复杂度为O(n)
思想:模拟。采用一个栈,对两个序列设置双指针:对于压入序列元素分别压入,若栈顶与弹出序列当前元素一致,则弹出。遍历完压入序列后,若栈为空,则为合法序列,否则不合法。
“`java stack = new Stack();
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
//画图模拟
if(pushed == null || pushed.length <= 0) { return true; } int k = 0; Stack
for(int i = 0; i
简单
思路:& pushed, vector & popped) { mystack;
入栈元素每入栈一个就与popped序列中的元素做比较,如果相等,出栈,popped序列的指针加一,最后栈为空则二者相符,否则不相符
代码c++
”’
class Solution {
public:
bool validateStackSequences(vector
stack
int PopIndex = 0;
for (int i=0; i<pushed.size(); i++){
mystack.push(pushed[i]);
while((!mystack.empty()) && (mystack.top() popped[PopIndex])){
mystack.pop();
PopIndex += 1;
}
}
return mystack.empty();
}
};
”’
在每次入栈完,判断出栈数组是否为栈顶元素,是的话就模拟出栈操作。
class Solution { stack = new Stack(); popped[k]){
public boolean validateStackSequences(int[] pushed, int[] popped) {
if(pushed null || pushed.length <= 0){
return true;
}
int k = 0;
Stack
for(int i = 0; i < pushed.length; i++){
stack.push(pushed[i]);
while(!stack.isEmpty() && stack.peek()
stack.pop();
k++;
}
}
return stack.isEmpty();
}
}
时间复杂度:O(n)
额外空间复杂度:O(n)
c++实现 st;
if(pushed.size()!=popped.size())return false;
stack
int len = pushed.size();
for(int i = 0,j=0;i<len;i++)
{
st.emplace(pushed[i]);
while(!st.empty()&&st.top()popped[j])
{
st.pop();
j++;
}
}
return st.empty();
多思考了一些点,为什么要为空。等
时间复杂度为n,空间复杂度为n.
【时间O(n),空间O(n)】
模拟栈操作
逐个压入元素
若当前元素与弹出元素相同,则循环弹出元素
判断栈空