如何解决如何以 O(1) 时间复杂度删除堆栈的中间元素?
好吧,我在 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()
。您不应该直接访问底层数组。再说一次,拼图在使用递归时打破了它自己的抽象。递归有自己的栈,实际上是一个额外的数据结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。