2つの整数シーケンスを入力します。最初のシーケンスはスタックがプッシュされる順序を表します。2番目のシーケンスがスタックのポップアップ順序であるかどうかを判断してください。スタックにプッシュされたすべての数値が等しくないと仮定します。たとえば、シーケンス{1,2,3,4,5}は特定のスタックのプッシュシーケンスであり、シーケンス{4,5,3,2,1}はプッシュシーケンスに対応するポップシーケンスですが、{ 4,3、5,1,2}をスタックシーケンスのポップシーケンスにすることはできません。
例1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
例2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
促す:
0 <= push.length == popped.length <= 1000
0 <= push [i]、popped [i] <1000 pushは、pop
の配置です。
注:この質問は、メインサイトの質問946と同じです:https://leetcode-cn.com/problems/validate-stack-sequences/
問題解決のアイデア:
以下に示すように、プレスポップシーケンスへの特定のシーケンスがプッシュおよびポップされ、プッシュ/ポップ操作の順序(つまり、配置)は一意に決定されます。
以下に示すように、データ操作には最初の特性の後にスタックがあるため、一部のポップアップシーケンスを実行できません。
プッシュされたと指摘されたタイトルは、ポップのアレンジです。したがって、プッシュとポップの長さが異なる場合や、要素が異なる場合を考慮する必要はありません。
class Solution {
public:
// 建立辅助栈,按照入栈出栈顺序模拟一次,若最后辅助栈为空则返回true
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
// 辅助栈
stack<int> stk;
int i = 0;
for (int p : pushed) {
// 按照pushed的顺序以此入栈
stk.push(p);
// 如果辅助栈不为空,且辅助栈的栈顶元素等于出栈的元素,则出栈,出栈序号加1
while (!stk.empty() && stk.top() == popped[i]) {
stk.pop();
i ++;
}
}
return stk.empty();
}
};
複雑さの分析:
時間計算量O(N):ここで、Nはプッシュされたリストの長さです。各要素は、最大で1回プッシュおよびポップされます。つまり、合計2Nのプッシュおよびポップ操作が最大で実行されます。
スペースの複雑さO(N):補助スタックスタックは、同時に最大N個の要素を格納できます。
著者:jyd
リンク:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya -ru-dan-chu-xu-lie-mo-n-2 /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。