实现删除堆栈中的相邻编号,剩余数量是多少?

时间:2018-11-15 16:32:58

标签: algorithm time-complexity

假设我们有一个带有n个数字的堆栈,并且如果3个或更多相邻数字相等,则可以删除这些数字(这些数字从上到下删除)。由于这是一个堆栈,因此我们具有常规的push()pop()top()操作,并且我们知道n。此外,我有一个空堆栈和O(1)额外的内存空间。是否有线性算法可以找到剩余数量?如果是,那会是什么?

2 个答案:

答案 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):

  1. 弹出元素E弹出堆栈
  2. 如果E = P,则增加C,否则将C设置为1。
  3. 如果C> = 3,请从第二个堆栈中弹出元素,覆盖E,直到E = / = P
  4. 将E推入第二个堆栈。
  5. 从1开始重复,直到第一个堆栈为空,然后从其中弹出并推入所有值 将临时堆栈放回原始位置,并按照您的方式为每个数字增加一个计数器。