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

摘要

剑指 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》

相关内容

热门资讯

7月4日人工智能ETF(515... 7月4日,人工智能ETF(515980)跌0.29%,成交额1.09亿元。当日份额减少2100.00...
7月4日创业大盘ETF(159... 7月4日,创业大盘ETF(159814)跌0.24%,成交额5206.75万元。当日份额增加600....
7月4日科创100ETF华夏(... 7月4日,科创100ETF华夏(588800)跌0.41%,成交额1.23亿元。当日份额减少750....
2017年6月20日大写怎么读 2017年6月20日大写怎么读2017年6月20日大写怎么读和小写的读法一样,只是写法不同标准的是 ...
7月4日中证A50ETF(15... 7月4日,中证A50ETF(159591)涨0.43%,成交额5372.73万元。当日份额减少300...
7月4日中证1000ETF(5... 7月4日,中证1000ETF(512100)跌0.39%,成交额8.51亿元。当日份额减少2200....
7月4日医疗ETF(51217... 7月4日,医疗ETF(512170)涨0.00%,成交额4.17亿元。当日份额减少1.00亿份,最新...
7月4日恒生创新药ETF(52... 7月4日,恒生创新药ETF(520500)涨0.80%,成交额12.36亿元。当日份额增加300.0...
张飞的武功如何,为什么三番两次... 张飞的武功如何,为什么三番两次敢挑战超级无敌吕布呢?张飞的武功是非常强大的,他之所以敢挑战吕布,就是...
7月4日自由现金流ETF(15... 7月4日,自由现金流ETF(159201)涨0.39%,成交额2.80亿元。当日份额减少2700.0...