微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以 O(1) 时间复杂度删除堆栈的中间元素?

如何解决如何以 O(1) 时间复杂度删除堆栈的中间元素?

好吧,我在 GeeksforGeeks 上使用数组尝试了这个问题。但是 GeeksforGeeks 中的解决方案说我们必须使用链表以 O(1) 的时间复杂度删除堆栈的中间元素。但是我也有一个使用数组的解决方案,我想确认它是否正确。删除中间元素的解决方法是:-

假设我们有一个名为 stk[] 的堆栈

  1. 通过计算 m=(Top+1)/2 找到中间元素
  2. 交换 stk[Top] 和 stk[m] 的值
  3. 删除最顶层的元素
  4. 然后再次交换值 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 举报,一经查实,本站将立刻删除。