大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
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
的一个排列
思路
- 先读一下题,这道题目看起来有点绕,实际上想表达的是从左边待
pushed
的数组中,每轮push
一个元素进去,同时,看心情拿出来,每轮可以拿任意个也可以不拿,有没有办法返回右边的数据结构;意思就是说,左边的pushed
代表男嘉宾,每次出来一个,如果能被心动女生选中,他们就牵手成功下台,不然的话就放在待选区(stack
),等待女生挑选,待选区每次排好队了,只能看到最后一个男嘉宾。女嘉宾也是如此,只能看到最前面那个,当最前面那个牵手成功后,这时候第二位女嘉宾,和倒数第二位男嘉宾就有机会对上眼神了,如果确认过颜色是对的人那么就再次牵手成功一对,一直到没有男嘉宾或者女嘉宾为止; - 那么我们只需要经过一轮遍历,用
stack
记录未匹配上的男嘉宾,每次男嘉宾上台就push
进stack
中,同时匹配一下当前男嘉宾(数组的最后一位)和心动女生(待返回列表的第一位)是否匹配即可; - 如果不匹配,那么继续下一轮,如果匹配上了,当前数组删除最后一个元素,右边列表删除第一个元素,继续匹配他们是否契合,契合的双方就牵手成功,一起离开舞台;
- 最后遍历结束,看看有没有男嘉宾还留在台上(
stack
)即可。
实现
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function(pushed, popped) {
const n = pushed.length;
// 待选区,没跟心动女生配对上的走过来
let stack = [];
// 所有男嘉宾依次上台
for (let i = 0; i < n; i++) {
stack.push(pushed[i]);
// 待选区最后一个男嘉宾和第一位女嘉宾是否匹配
while (stack.length && stack[stack.length - 1] === popped[0]) {
// 牵手成功, 最后一位男嘉宾和第一位女嘉宾携手离场
stack.pop();
popped.shift();
}
}
// 判断是否所有男嘉宾都离场即可
return stack.length === 0;
};
复制代码
结果
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。