剑指 Offer 31. 栈的压入、弹出序列
创始人
2024-05-29 06:36:07

摘要

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

一、判断是否为栈解析

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

这道题需要利用给定的两个数组pushed和popped的如下性质:

  • 数组 pushed中的元素互不相同;
  • 数组 popped和数组 pushed的长度相同;
  • 数组 popped是数组 pushed的一个排列。

根据上述性质,可以得到如下结论:

  • 栈内不可能出现重复元素;
  • 如果pushed和popped是有效的栈操作序列,则经过所有的入栈和出栈操作之后,每个元素各入栈和出栈一次,栈为空。

因此,可以遍历两个数组,模拟入栈和出栈操作,判断两个数组是否为有效的栈操作序列。模拟入栈操作可以通过遍历数组 pushed实现。由于只有栈顶的元素可以出栈,因此模拟出栈操作需要判断栈顶元素是否与popped的当前元素相同,如果相同则将栈顶元素出栈。由于元素互不相同,因此当栈顶元素与popped的当前元素相同时必须将栈顶元素出栈,否则出栈顺序一定不等于popped。

根据上述分析,验证栈序列的模拟做法如下:

  • 遍历数组 pushed,将 pushed的每个元素依次入栈;
  • 每次将 pushed的元素入栈之后,如果栈不为空且栈顶元素与popped的当前元素相同,则将栈顶元素出栈,同时遍历数组 popped,直到栈为空或栈顶元素与 popped的当前元素不同。

遍历数组pushed结束之后,每个元素都按照数组pushed的顺序入栈一次。如果栈为空,则每个元素都按照数组popped的顺序出栈,返回true。如果栈不为空,则元素不能按照数组 popped的顺序出栈,返回false。

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack stack=new Stack<>();int index=0;for (int i:pushed){stack.add(i);while (!stack.isEmpty()&&stack.peek()==popped[index]){stack.pop();index++;}}return stack.isEmpty();}
}

复杂度分析

  • 时间复杂度:O(n),其中n是数组 pushed和 popped的长度。需要遍历数组 pushed和 popped各一次,判断两个数组是否为有效的栈操作序列。
  • 空间复杂度:O(n),其中n是数组 pushed和 popped的长度。空间复杂度主要取决于栈空间,栈内元素个数不超过n。

博文参考

 《leetcode》

相关内容

热门资讯

日本民众举行“抗议高市”集会,...   10日晚间,约2.7万名日本民众聚集在东京的国会议事堂周边,手持彩色荧光棒举行名为“国会前行动:...
AI眼中的世界杯8强:14个模...   世界杯进入最后冲刺阶段,冠军争夺已经进入白热化。而在球场之外,另一场“比赛”也迎来关键阶段如今,...
中国石化宣布完成对中国航油的重... (来源:长江日报)记者从中国石化新闻办获悉,中国石化宣布完成对中国航油的重组工作,中国航油正式成为中...
史诗级回收!科技股行情是撤退还... 周五的行情体会就三个字——挫败感。见证航天事业重大突破的同时,也承受着账户缩水的现实。这是资金转移到...
4100亿跌到1000亿,Mi... 解禁期将至,MiniMax再迎大考。文|金玙璠编辑|魏佳来源|定焦One(ID:dingjiaoon...