本文主要是介绍[leetcode] 946. 验证栈序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给定 pushed
和 popped
两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true
;否则,返回 false
。
示例 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 之前弹出。
提示:
1 <= pushed.length <= 1000
0 <= pushed[i] <= 1000
pushed
的所有元素 互不相同popped.length == pushed.length
popped
是pushed
的一个排列
代码
/** * @author Fancier * @version 1.0 * @description: 验证栈序列 * @date 2024/3/8 20:34 */class Solution { //错误的情况 //大的出来了 小比中间的先出来 public boolean validateStackSequences(int[] pushed, int[] popped) { int[] map = new int[1001]; for (int i = 0; i < pushed.length; i++) { map[pushed[i]] = i; } boolean[] isPop = new boolean[popped.length]; int max = -1; for (int i = 0; i < popped.length; i++) { int index = map[popped[i]]; isPop[index] = true; if (max < index) max = index; for(int j = index; j < max; j++) if (!isPop[j]) return false; } return true; }
}
题解
分析错误情况我们会发现只有一种情况会是错误的
假设先后push了 a b c
如果pop 的顺序位 c a b, 那么答案就是false
因为c出栈了a b 还没出栈 那么a b肯定还在栈内了 那么b肯定先a出栈
如果a先b出栈了 那么答案肯定是false
翻译一下:
大的出来了 小比中间的先出来
这道题我们只需要关注下标, 出栈对错只与顺序有关
因为push 和 pop数组中的值不重复, 所以我们就可以用一个数组来映射一下下标
将 下标 -> 值 变为 值 -> 下标
这样取到pop数组中下标的值就可以知道这个值push的顺序了
具体代码参上
好的!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)
原题链接
这篇关于[leetcode] 946. 验证栈序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!