剑指 Offer 31. 栈的压入、弹出序列--辅助栈

1.题目

2.思路

一开始不知道有啥思路,想过递归DFS,后来感觉不行。
后来想能不能模拟。看一下有没有规律。发现有个很有意思的点。

  • 1.如果保证了第一个元素是最后弹出,那么可以过80多个用例。return poped[n - 1] == pushed[0]
  • 2.发现有的用例过不了,因为还可以第一个元素最先被弹出,加一个或|| poped[0] == pushed[0],发现可以过116个用例。
  • 3.然后就不知道咋做了。。。。看答案。果然栈的题目还是得靠栈来解决!!!!

正解--辅助栈--O(N)-4ms

先挨个将pushed元素压入栈,如何判断栈顶元素和poped[i]是否相等

  • 如果相等:那么弹出栈顶元素,继续判断栈顶
  • 如果不等,那么继续压入元素

最终结果:返回栈是否为空 或者 i 是否 等于 n

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        // 1.错误方法:保证第一个数,肯定是最后弹出。(或者是最先弹出)  --能过116个用例,简直离谱!!!
        // int n = pushed.length;
        // if(n == 0) return true;
        // return popped[n - 1] == pushed[0] || pushed[0] == popped[0];


        // 辅助栈.O(n + n)
        // 每次判断栈顶元素和poped元素是否相等
        // 相等就一致弹出,不相等,就压入栈。
        int n = pushed.length;
        if(n == 0) return true;
        Stack<Integer>stack = new Stack();
        int i = 0;
        for(int num : pushed){
            stack.push(num);
            while(!stack.isEmpty() && stack.peek() == popped[i]){
                i++;
                stack.pop(); //只要栈顶相等,就一直弹出元素
            }
            // while循环结束说明要么不相等了,要么为空了,这两种情况都应该压入栈了。
        }
        // for循环外,如果把所有的元素都压入栈中模拟完,如果仍然还有元素在栈中,说明为false.(或者 return i == n)
        return stack.isEmpty();
        // return i == n; //两种返回都是ok
        

    }
}

3.结果

 为啥是4ms ,不是0ms?

别人应该是采取了类似双指针移动的方式,会更快一点,代码中有两个while循环,但是我觉得写成这个样子已经很简洁了,时间复杂度也是O(N)。

4.想法

1.做不出来的时候,可以想一下特殊用例,找找规律,说不定也可以过一些例子,在笔试的时候可以尝试一下。

2.思路是来源于题干的,首先看题中用到的数据结构和数组大小,如果思路错了,那么做出来的可能性很难,或者代码很差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值