在 O(1) 中实现堆栈(push、pop 和 findmin)

2024-01-10

我已经看过这个问题的两个堆栈实现,但我真的很困惑如何获得 O(1) 操作。 考虑以下示例:

S1[3542761986759]
S2[3332221111111]

这里的想法/算法是

  1. 将元素 E 推到 S1 上
  2. 检查 S2 的顶部是否 >= E,如果为真,则在 S2 上插入 E

但是当调用 getMin 时,我们返回 S2 的顶部,但这使 S2 处于奇怪的状态,因为 S2 包含重复的当前最小元素,因此解决方案是在 S2 中搜索下一个最小元素并返回它。这是 O(n)。

谁能帮我理解解决方案吗?


使用链表存储当前最小值。当您添加新数字时,它会查看前一个最小值,如果当前值较低,则将当前最小值更改为当前值。

例如...假设您有数据:3,6,4,2,7,1。那么列表就是这样的

值|最小值

3|3 -> 6|3 -> 4|3 -> 2|2 -> 7|2 -> 1|1

当您推送/弹出项目时,它将记录分钟数。 当然,您需要有一个根节点和一个指定为“页脚”的节点,以便您可以在 O(1) 内访问末尾。

或者您可以向后移动并将内容添加到前面并在每次插入时更改根节点......这也可以。它会是这样的:

1|1 -> 7|2 -> 2|2 -> 4|3 -> 6|3 -> 3|3

那么您就不需要“页脚”节点。

这两者都会跟踪推送值时的当前最小值。这样,当推送实际最小值时,它将知道 O(1) 中的第二个最小值是多少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 O(1) 中实现堆栈(push、pop 和 findmin) 的相关文章

  • 在 c 中使用 malloc 实现堆栈 [初学者]

    出于学习目的 我正在用 c 语言实现一个堆栈及其函数 我添加了一些小的附加功能来第一次使用 malloc 并尝试正确理解它 我编写了一个最初创建堆栈结构的函数 该函数的返回值是一个具有已分配内存的新结构 在返回值应该是结构的函数中处理 ma
  • 我可以创建一个 Android 应用程序作为模板吗?

    我不确定它的标题是否正确 但我会解释我的意思 我正在制作多个 Android 应用程序 但它们具有相同的结构 滑动菜单 列表视图 关于我 服装对话框 复制 分享 喜欢 对样式进行一些修改 颜色 背景 字体 菜单字符串 我的问题是 有没有办法
  • 使用堆栈反转数组

    我正在尝试使用堆栈反转数组 但是 我收到错误arr i stack top 在 Eclipse 中解决它的建议是将其更改为arr i stack pop 或添加演员阵容 还有其他方法吗 或者我犯了一个错误 我看到教程和问题询问如何使用堆栈反
  • C++:在堆栈中存储结构

    我有一个结构 struct Vehicle char ad Arrival departure char string license license value int arrival arrival in military time 我
  • Minhash实现如何找到排列的哈希函数

    我在实施 minhashing 时遇到问题 在纸上和阅读中我理解了这个概念 但我的问题是排列 技巧 实现的建议不是排列集合和值的矩阵 而是 选择 k 例如 100 个独立的哈希函数 然后算法表示 for each row r for eac
  • SVG 1.1:什么是“用户单位”以及如何将用户单位转换为绝对单位(例如:毫米)?

    我正在实现 SVG Tiny 1 1 但我无法理解 用户单元 的概念 SVG 1 1 规范将每个没有指定单位 例如 mm cm pt 等 的 定义为 用户单位 在实现 SVGLength 接口时 我遇到了4个与长度值相关的属性 value
  • C# 接口实现 - 为什么这不能构建?

    抱歉 如果之前有人问过这个问题 但实际上不可能用谷歌搜索 我认为 int 数组实现了 IEnumerable 因此 Thing 应该能够实现 IThing 怎么没有呢 public interface IThing IEnumerable
  • 在Java中,为什么Stack是一个具体类,而Queue是一个接口?

    Queue 的哪一个子类是 普通 队列 1 java util Stack 是 Java 1 0 的遗留类 它早于 Collections 框架很多年 坦率地说 它是一个例子horrible多方面的设计 一切都不是事情应有的样子 主要问题是
  • 增加java中单个工作线程的堆栈空间

    在我的java web应用程序中 我有一个后台工作线程 它需要大量的堆栈空间 因为它使用activiti工作流引擎和groovy脚本任务运行一个非常复杂的工作流 目前 我需要在 64 位 Java 和 Tomcat 上将 JVM Xss 设
  • Bluecove:以编程方式重新启动蓝牙堆栈

    我正在尝试关闭蓝牙服务 但 Bluecove 在连接关闭方法上有错误 https code google com p bluecove issues detail id 90 https code google com p bluecove
  • 如何在 R 中使用神经网络包时实现自己的误差函数?

    我正在尝试在 R 中的神经网络包中实现自定义错误函数 通常使用代表误差平方和和交叉熵的 sse 和 ce 来计算误差 任何人都可以向我提供有关如何实现自己的误差函数的详细信息 虽然软件包说我们可以使用自定义的错误函数 但用户手册中没有对此提
  • 从 Android 应用程序堆栈中手动删除活动

    我一直在开发 Android Native App 我想做的是 Activities A gt B gt C Then A gt B gt C gt C 从 C Activity 中 如果它再次指向 C 那么我想手动从堆栈中删除 C B 在
  • 修改栈上的返回地址

    我研究了缓冲区溢出漏洞的基础知识 并尝试了解堆栈是如何工作的 为此 我想编写一个简单的程序 将返回地址的地址更改为某个值 有人可以帮助我计算基指针的大小以获得第一个参数的偏移量吗 void foo void char ret char pt
  • BigInteger 数字的实现和性能

    我用 C 编写了一个 BigInteger 类 它应该能够对任何大小的所有数字进行运算 目前 我正在尝试通过比较现有算法并测试它们最适合哪些位数来实现非常快速的乘法方法 但我遇到了非常意外的结果 我尝试进行 20 次 500 位数字的乘法
  • C 函数堆栈布局

    我有一个看起来像这样的函数 int bof char str char buffer 12 strcpy buffer str return 1 我正在尝试覆盖其返回地址 我发现我可以通过使用来做到这一点 例如 memcpy buffer
  • printf() var-arg 引用如何与堆栈内存布局交互?

    给出代码片段 int main printf Val d 5 return 0 是否有任何保证编译器会存储 Val d and 5 连续地 例如 d l a V 5 Format String
  • 为什么 split(' ') 试图变得(太)聪明了?

    我刚刚发现以下奇怪的行为String split a tb c nd split gt a b c d a tb c nd split gt a b c d a tb c nd split gt a tb c nd 来源 https git
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • 在 iOS4 中视图控制器即将弹出时收到通知

    这个问题以前有人问过 但我能找到的答案是 2009 年的 不适合我的问题 让我重申一下这个问题 我有一个UINavigationController产生并推动许多不同的UIViewControllers 入栈 其中之一涉及一些核心数据操作

随机推荐