Greedy Algorithm to Validate Stack Sequences
- 时间:2020-09-10 13:03:17
- 分类:网络文摘
- 阅读:158 次
Given two sequences pushed and popped with distinct values, return true if and only if this could have been the result of a sequence of push and pop operations on an initially empty stack.
Example 1:
Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
Output: true
Explanation: We might do the following sequence:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
Example 2:Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
Output: false
Explanation: 1 cannot be popped before 2.Note:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed is a permutation of popped.
pushed and popped have distinct values.
How to Validate a Stack Sequence using a Stack and Greedy Algorithm?
Let’s use a stack to simulate the push operations (in order) to the stack, and pop the elements if they are next to pop.
Let’s say if the top of the stack is 1, and the next element to pop is also 1, we have to pop it from the stack otherwise, any subsequent push will overwrite the top of the stack and the element we want to pop next will not be ever popped.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int> st; int i = 0; for (const auto &n: pushed) { st.push(n); while (!st.empty() && st.top() == popped[i]) { st.pop(); i ++; } } return i == pushed.size(); } }; |
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int i = 0;
for (const auto &n: pushed) {
st.push(n);
while (!st.empty() && st.top() == popped[i]) {
st.pop();
i ++;
}
}
return i == pushed.size();
}
};When all the elements are pushed, we have to check if the number of popped elements is the same as the number of pushed elements to the stack.
The above C++ solution to validate the stack sequences run at O(N) time and O(N) space respectively.
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:三下乡中的失误和反省 六年级感恩父亲节作文1000字 手工纸剪小树数学题:用一张长45cm、宽21cm的手工纸,能剪几棵这样的小树? 数学题:两人轮流报数,每次只能报1或2,把两人报的所有数加起来 数学题:下面三位同学要去量身高、验视力,每项检查都要3分钟 沏茶问题练习题 数学题:爸爸开车和妈妈一起从家外出办事 怎样安排最节省时间的问题 判断:32:40化简后得4/5,与其比值相等。( )对吗? 用0,2,3,4,5组成三位数乘两位数的乘法算式,你能写出几个?你能写出乘积最大的算式吗?
- 评论列表
-
- 添加评论