Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 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
提示:
0 <= pushed.length == popped.length <= 1000 0 <= pushed[i], popped[i] < 1000 pushed 是 popped 的排列。
二、思路分析
- 考虑模拟入栈出栈过程解决该问题。
- 开启一个栈,并且用j表示当前出栈数组遍历到第几个。
- 遍历入栈数组,向栈中添加元素,如果栈中最后一个元素与popped[j]相同,则说明匹配出栈序列成功,如果栈顶元素仍然与出栈数组当前元素相同,则一直出栈。
- 最后栈中元素可以全部出栈成功,意味着与出栈序列完全匹配。
三、AC 代码
func validateStackSequences(pushed []int, popped []int) bool {
stack := make([]int,0)
j := 0
for i := range pushed {
stack = append(stack,pushed[i])
for len(stack) > 0 && stack[len(stack)-1] == popped[j] {
stack = stack[:len(stack)-1]
j++
}
}
return len(stack) == 0
}
复制代码
四、总结
这是一道栈相关题目,可以通过模拟的方式模拟入栈出栈过程,并与相应的数组匹配。