算法1
(栈) $O(n)$
用一个新栈s来模拟实时进出栈操作:
在for loop里依次喂数,每push一个数字就检查有没有能pop出来的。
如果最后s为空(或者popId==popV.size()),说明一进一出刚刚好。
时间复杂度分析:一共push n次,pop n次。
C++ 代码
class Solution {
public:
bool isPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.empty() || popV.empty() || pushV.size()!=popV.size()) return false;
stack<int> s;
int popId=0;
for(int pushId=0;pushId<pushV.size();++pushId){
s.push(pushV[pushId]);
while(!s.empty() && s.top()==popV[popId]){
s.pop();
++popId;
}
}
if(s.empty()) return true;
return false;
}
};
判断可以优化一下
整体代码:
寄了吗、,代码看不懂
class Solution {
public:
bool isPopOrder(vector[HTML_REMOVED] pushV,vector[HTML_REMOVED] popV) {
if(pushV.size() != popV.size()) return false;
if(pushV.empty() && popV.empty() ) return true;
int n = pushV.size();
int idx = 0, j = 0; //用来遍历pushV。
stack[HTML_REMOVED] s;
for (int i = 0; i < n; i )
{
s.push(pushV[i]);
while(s.top() == popV[idx])
{
s.pop();
idx;
if(s.empty()) break;
}
};
两个都空可以不用特判的,这样特判反而还要看一下两个是不是都空,如果不判断后面的跳过到了$s.empty()$依然是true
我不理解啊,为什么不是逆序啊
他没说一定要全部押进去在弹
输入输出皆空时return true
最后一句可以改成
return s.empty()
if(pushV.empty()&&popV.empty())
return true;
把这个放在第一行也可以
两个都为空,测试的时候是True。边界条件应该改成 :
if(pushV.empty() || popV.empty()) return pushV.empty() && popV.empty();
if(pushV.size()!=popV.size()) return false;
正解