问题描述
好吧,我在 GeeksforGeeks 上使用数组尝试了这个问题。但是 GeeksforGeeks 中的解决方案说我们必须使用链表以 O(1) 的时间复杂度删除堆栈的中间元素。但是我也有一个使用数组的解决方案,我想确认它是否正确。删除中间元素的解决方法是:-
假设我们有一个名为 stk[] 的堆栈
- 通过计算 m=(Top+1)/2 找到中间元素
- 交换 stk[Top] 和 stk[m] 的值
- 删除最顶层的元素
- 然后再次交换值 stk[Top] 和 stk[m]
如果栈元素数小于3,就删除栈顶的元素。 我认为这个解决方案的时间复杂度也是 O(1),因为这里没有运行循环。那么有人能说这是解决这个问题的正确方法吗?
解决方法
我假设您指的是 this puzzle。你的方法改变了元素的顺序。例如,如果堆栈是
1 2 3 4 5 6 7
(底部为 1,顶部为 7),然后在第 2 步之后我们有
1 2 3 7 5 6 4
在第 3 步之后
1 2 3 7 5 6
最后在第 4 步之后
1 2 3 6 5 7
,这不是我们想要的(我们想要 1 2 3 5 6 7
)。
此外,您的方法打破了难题提出的抽象,即仅使用堆栈操作 push()
、pop()
和 empty()
。您不应该直接访问底层数组。再说一次,拼图在使用递归时打破了它自己的抽象。递归有自己的栈,实际上是一个额外的数据结构。