问题分析
- 小N要从一组堆叠好的碗中按指定顺序取出碗。
- 碗从1到M按顺序堆叠,最底层是1,最上层是M。
- 每次只能从堆顶取碗。
- 给定的序列表示取碗的顺序,我们要判断这个取碗顺序是否可能。
解决思路
-
使用一个栈来模拟取碗过程。
-
初始化当前需要取的碗号为1,即从最底层的1开始。
-
遍历给定的取碗顺序列表
a:- 如果当前需要的碗号与取碗顺序列表中的碗号相同,则说明可以取该碗。
- 如果当前碗号小于目标碗号,则依次将碗号压入栈中,直到找到目标碗号为止。
- 如果栈顶的碗号与目标碗号不符,且无法通过其他操作实现,则返回0。
-
如果遍历结束且取碗顺序可行,则返回1。
stack = [] # 用来模拟取碗的过程
current_bowl = 1 # 从碗1开始
for bowl in a:
# 如果当前碗号小于目标碗号,依次压入栈
while current_bowl <= M and (not stack or stack[-1] != bowl):
stack.append(current_bowl)
current_bowl += 1
# 如果栈顶元素是目标碗号,取出该碗
if stack and stack[-1] == bowl:
stack.pop()
else:
return 0
return 1
# 测试样例
print(is_valid_sequence(2, [1, 2])) # 输出:1
print(is_valid_sequence(3, [3, 1, 2])) # 输出:0
print(is_valid_sequence(4, [1, 3, 2, 4])) # 输出:1
代码解释
1.初始化代码stack为空,用于模拟堆栈
2.用current_bow1表示当前要压入栈的碗号,从1开始
3.遍历a中的每个目标碗号:
- 如果current_bow1小于目标碗号,依次将碗号压入栈,直到目标碗号出现在栈顶。
- 如果栈顶元素等于目标碗号,则取出栈顶元素
- 如果栈顶元素不等于目标碗号,则返回0
4.如果遍历结束时所有碗都能按顺序取出,返回1
写这个代码时,感觉最有趣的地方在于如何利用栈来模拟实际取碗的过程,通过将需要的碗压入栈,然后检查栈顶是否符合当前的取碗顺序,这种解决办法,即简单又明了的解决了这个问题,这种办法也很高效,不用过多的遍历,就能让整个过程都易于理解和实现,