假设我们有一个包含n
数字的堆栈,如果3个或更多个相邻数字相等,则可以删除这些数字(从上到下删除这些数字(。由于这是一个堆栈,我们有正常的push()
、pop()
、top()
操作,我们知道n
。此外,我有一个空堆栈和O(1)
额外的内存空间。有没有一种线性算法可以找到剩余数的数量?如果是,那会是什么?
这个想法非常简单。我们只需将条目移动到另一个堆栈,并计算我们将删除的数量。为此,我们跟踪最后一个元素以及我们见过它的次数:
lastElement = ∅ //no last element
lastElementSeen = 0 //how many times did the last element occur in succession
totalRemoved = 0 //how many elements would we remove?
while(!stack.empty)
element = stack.top
stack.pop()
otherStack.push(element)
if element == lastElement
lastElementSeen++
else
if lastElementSeen >= 3
totalRemoved += lastElementSeen
lastElement = element
lastElementSeen = 1
您还可以选择从其他堆栈中实际移除元素,而不是仅对它们进行计数。如果你不再需要它们,你也可以选择不把它们放在另一个堆栈中。
如果恒定内存空间至少为N,则朴素方法已经是线性的:(
也就是说,给定p=先前值(初始化为无穷大(和C=计数器(初始化为0(:
- 弹出元素E
- 如果E=P,则递增C,否则将C设置为1
- 如果C>=3,继续弹出元素,覆盖E,关闭第二个堆栈,直到E=/=P
- 将E推到第二个堆栈上
- 从1开始重复,直到第一个堆栈为空,然后弹出并推送临时堆栈回到原来的,像您所做的那样为每个数字递增一个计数器