算法题:剑指 Offer 31. 栈的压入、弹出序列(题目+思路+代码+注释)快速幂解法 时空 1ms击败97%用户
一次AC的快乐
题目
剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {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 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 第一种思路,暴力穷举,备用之选,暂不考虑。
- 第二种思路,观察出入栈,找出办法来校验。
我们可以看示范例子想一下,pushed = [1,2,3,4,5],popped = [4,5,3,2,1],假设现在有个栈来存,然后第一个数组是可以用来往里面添加数的,第二个数组是需要弹出的。那我们最终目标是弹出第二个数组所有的,从弹出第一个(popped数组)开始,需要弹出4,我们去看当前栈的栈顶有没有4,有就正好弹出,没有那就压入一个,再继续尝试,直到弹出所有。我们可以发现这样来检测复杂度是很低的,只需要遍历一次即可完成。另外题目中写到了数组长度可以为0,那做一个提前判断,一旦为0返回true。因此写完代码检查后没问题,然后提交,秒了这个中等算法题。
代码
import java.util.Stack;
/**
* @author humorchen
* @date 2021/11/10 10:20
*/
public class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
if (pushed.length == 0){
return true;
}
Stack<Integer> stack = new Stack<>();
int pushedIndex = 0,pushedSize = pushed.length, poppedIndex = 0,poppedSize = popped.length;
while (poppedIndex < poppedSize){
int popItem = popped[poppedIndex];
//弹出一个来
if (stack.size() > 0 && stack.peek() == popItem){
//是对的就弹出
int p = stack.pop();
// System.out.println("弹出 "+p);
poppedIndex++;
continue;
}
//需要压入栈一个
if (pushedIndex < pushedSize){
//压栈后继续循环执行
stack.push(pushed[pushedIndex++]);
// System.out.println("压入 "+stack.peek());
}else {
//没有了
// System.out.println("找不到 "+popItem+" 返回失败");
return false;
}
}
// System.out.println("返回成功");
return true;
}
public static void main(String[] args) {
int[] pushed = {1,2,3,4,5};
int[] popped = {4,5,3,2,1};
System.out.println(new Solution().validateStackSequences(pushed,popped));
}
}
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039526