2022/01/[路飞][LeetCode]946_验证栈序列/index

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给定pushedpopped两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入push和弹出pop操作序列的结果时,返回true;否则,返回false

示例 1:

1
2
3
4
5
输入: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:

1
2
3
输入: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出: false
解释: 1 不能在 2 之前弹出。

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed的所有元素 互不相同
  • popped.length == pushed.length
  • poppedpushed的一个排列

解题思路

  • 首先我们需要理解的特点:先进后出,后进先出
  • 遍历pushed数组,将遍历的项插入到新数组中
  • 定义一个指针用于记录与popped比较到了什么位置
  • 如果遍历过程中有遍历的项与popped的上述指针所在项相同,移除新数组尾项
  • 将新数组从后往前与popped从指针所在位置往后进行比较
  • 直到两个数组出现不同的项再去重复上面两步
  • 如果新数组正好长度为0则说明满足题意

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
var validateStackSequences = function(pushed, popped) {
let arr = []
let popindex = 0
for(let i =0;i<pushed.length;i++){
arr.push(pushed[i])
while(popindex<popped.length&&arr[arr.length-1]==popped[popindex]){
arr.pop()
popindex++
}
}
return arr.length==0
};

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]946_%E9%AA%8C%E8%AF%81%E6%A0%88%E5%BA%8F%E5%88%97/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog