假设我们有一个带有n
个数字的堆栈,并且如果3个或更多相邻数字相等,则可以删除这些数字(这些数字从上到下删除)。由于这是一个堆栈,因此我们具有常规的push()
,pop()
,top()
操作,并且我们知道n
。此外,我有一个空堆栈和O(1)
额外的内存空间。是否有线性算法可以找到剩余数量?如果是,那会是什么?
答案 0 :(得分: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
您还可以选择从其他堆栈中实际删除元素,而不仅仅是对其进行计数。如果您不再需要它们,也可以选择不将它们放在另一个堆栈中。
答案 1 :(得分:0)
如果常量存储空间至少为N,则幼稚的方法已经是线性的了:)
也就是说,给定P =先前值(初始化为Infinity)和C =计数器(初始化为0):