![]() |
1
13
您可以通过维护两个堆栈来完成此操作
在上面的解决方案中,每次将元素推到堆栈上时,都会有相应的推送
|
![]() |
2
2
为此,您的数据结构应该包含两个堆栈。一个应该正常工作;另一个只包含看到的最后一个最小元素。当您推送一个元素时,如果它小于/等于第二个堆栈的顶部(或者堆栈为空),也可以推送到第二个堆栈。当弹出一个元素时,如果它等于第二个堆栈的顶部,则也会弹出第二个堆栈。 在任何时候,最小值都是第二个堆栈的顶部。 |
![]() |
3
1
这个问题实际上是在问 Heap
PriorityQueue是一个经典的案例(堆的实现)。见
我希望在线上有一个简单的方法来引用Java语言源代码,在这里我可以看到并引用PrimyRealQueE类的实现。 |
![]() |
4
0
在不使用辅助堆栈的情况下,有一个更具创造性的解决方案。 假设我们要推一个数字 价值 以最小的数目放入堆栈 闽 . 如果 价值 大于或等于 闽 将其直接推送到数据堆栈中。如果小于 闽 ,我们推2**值*- 闽 和更新 闽 作为 价值 因为一个新的最小数字被推。 去流行音乐怎么样?如果数据堆栈的顶部(它表示为 顶部 )大于或等于 最小 . 否则号码 顶部 不是真正的推送号码。实际推送的号码存储为 最小 . 弹出当前最小数后,需要恢复前一个最小数,即2**分钟*- 顶部 . 现在让我们演示一下这个解决方案的正确性。什么时候? 价值 大于或等于 闽 ,它被直接推入数据栈而不更新 闽 .因此,当我们发现数据栈的顶部大于或等于 闽 ,我们可以直接弹出而不更新 闽 . 但是,如果我们发现 价值 那么少 闽 我们推2 值** 闽 . 我们应该注意到2 值** 闽 小于 价值 . 然后我们更新当前 闽 作为 价值 . 因此,新的数据栈顶部( 顶部 )小于当前值 闽 .因此,当我们发现数据堆栈的顶部小于 闽 ,真正的顶部(真正的推送数字 价值 )存储在 闽 . 在我们弹出数据栈的顶部之后,我们必须恢复以前的最小值。自从 顶部 =2**值*-上一个 闽 和 价值 是电流 闽 透水性的 闽 是2*电流 闽 - 顶部 . C++示例代码如下所示:
此解决方案借用自 my blog 还有我的书 Coding Interviews: Questions, Analysis & Solutions “。 |
![]() |
Mehmet Aslan · freertos堆栈不会溢出 9 月前 |
![]() |
rdre8 · x86指令,堆栈指针解释 1 年前 |
|
melonfsck · 是否允许在堆栈上分配旋转锁? 1 年前 |
|
Yashas Nadig · 调用堆栈lifo队列是否正确? 1 年前 |
![]() |
Sougata Mukherjee · 使用js中的stack反转句子 1 年前 |
|
Nurana · c堆栈(使用动态数组)realloc内存泄漏问题 1 年前 |