栈的压入、弹出序列
个人博客
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
题解
-
算法思想
- 循环将所有元素入栈
- 当栈中元素个数不为 0 并且栈顶元素等于弹栈序列元素时
- 将栈中元素弹出
- 并将弹栈序列指针后移一位
- 当栈中元素个数不为 0 并且栈顶元素等于弹栈序列元素时
- 循环结束,如果栈中元素个数为 0则为 true,否则为 false
- 循环将所有元素入栈
-
复杂度分析
- 时间复杂度O(n)
- 空间复杂度 O(n)
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Deque<Integer> stack = new ArrayDeque<>();
int i = 0;
for(int num:pushed){
stack.push(num);
while(stack.size() != 0 && stack.peek() == popped[i]){
stack.pop();
i++;
}
}
return stack.isEmpty();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ij5rW93L-1596646484848)(/Users/apple/Library/Application Support/typora-user-images/image-20200806005311663.png)]
总结
- 自己看了剑指 offer 的思路之后知道解法,但是写了好久还是不能通过,看了大佬的解法,真的好简洁,感觉自己写的时候思路还是不清晰。下次思路清晰再开始写代码