Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中维护堆栈的算法_Java_Collections - Fatal编程技术网

java中维护堆栈的算法

java中维护堆栈的算法,java,collections,Java,Collections,如何维护堆栈,以便无论何时从堆栈中弹出,都知道堆栈中的最小元素?算法应具有恒定的复杂性 提前感谢好的,这是你需要做的 您需要维护一些数据结构,其中包含插入的每个元素的信息,即插入该元素时的最小值和第二最小值 因此,您希望获得以下信息:- 对于每个按下的元素-> 插入后的最小值 插入前的最小值 从堆栈中弹出该元素时需要此信息。。所以,你们会知道,无论你们是否弹出最小值。。如果是,则可以在按下此元素之前用最小值替换当前最小值。。如果没有,则此时最小值不会发生变化 例如: 假设当前堆栈中有以下元素:-

如何维护堆栈,以便无论何时从堆栈中弹出,都知道堆栈中的最小元素?算法应具有恒定的复杂性


提前感谢

好的,这是你需要做的

您需要维护一些数据结构,其中包含插入的每个元素的信息,即插入该元素时的最小值和第二最小值

因此,您希望获得以下信息:-

对于每个按下的元素->

插入后的最小值 插入前的最小值 从堆栈中弹出该元素时需要此信息。。所以,你们会知道,无论你们是否弹出最小值。。如果是,则可以在按下此元素之前用最小值替换当前最小值。。如果没有,则此时最小值不会发生变化

例如:

假设当前堆栈中有以下元素:-

[3, 5, 7, 9, 2, 4]
然后你推一个值8。。那么您需要维护两个值。。 8英寸前的最小值,即2,8英寸后的最小值 插入,即2:-

min_value_before_push = min(stack)
push 8
min_value_after_push = min(stack)
如果你推一个值1,那么插入前的最小值是2, 插入_后的最小_为1:-

现在,您的堆栈是:-

[1, 8, 3, 5, 7, 9, 2, 4]
现在,如果您弹出,您将看到值1:-

因此,弹出将改变最小值,因此,在按1之前,用最小值更改当前最小值。。所以,你的最小值是2

当前堆栈变为:-

[8, 3, 5, 7, 9, 2, 4]
现在,让我们检查此算法是否适用于重复元素:-

假设要再次推送值2

然后你继续弹出,你会看到对于值2,推后的最小值是2,这意味着弹出它会改变最小值。。因此,将该值替换为推之前的最小值,也就是2。。这就是我们想要的

注意:-此算法的一个好处是,您不需要进行太多比较。。只需在按下时与当前_最小值进行比较。。以及弹出时与当前_最小值的比较


您可以尝试继续思考您可以拥有什么样的数据结构。

好的,下面是您需要做的

您需要维护一些数据结构,其中包含插入的每个元素的信息,即插入该元素时的最小值和第二最小值

因此,您希望获得以下信息:-

对于每个按下的元素->

插入后的最小值 插入前的最小值 从堆栈中弹出该元素时需要此信息。。所以,你们会知道,无论你们是否弹出最小值。。如果是,则可以在按下此元素之前用最小值替换当前最小值。。如果没有,则此时最小值不会发生变化

例如:

假设当前堆栈中有以下元素:-

[3, 5, 7, 9, 2, 4]
然后你推一个值8。。那么您需要维护两个值。。 8英寸前的最小值,即2,8英寸后的最小值 插入,即2:-

min_value_before_push = min(stack)
push 8
min_value_after_push = min(stack)
如果你推一个值1,那么插入前的最小值是2, 插入_后的最小_为1:-

现在,您的堆栈是:-

[1, 8, 3, 5, 7, 9, 2, 4]
现在,如果您弹出,您将看到值1:-

因此,弹出将改变最小值,因此,在按1之前,用最小值更改当前最小值。。所以,你的最小值是2

当前堆栈变为:-

[8, 3, 5, 7, 9, 2, 4]
现在,让我们检查此算法是否适用于重复元素:-

假设要再次推送值2

然后你继续弹出,你会看到对于值2,推后的最小值是2,这意味着弹出它会改变最小值。。因此,将该值替换为推之前的最小值,也就是2。。这就是我们想要的

注意:-此算法的一个好处是,您不需要进行太多比较。。只需在按下时与当前_最小值进行比较。。以及弹出时与当前_最小值的比较

您可以尝试继续思考您可以拥有什么样的数据结构。

使用另一个堆栈,例如minStack,当推送元素val时,检查val是否 现在我们有了一个minStack,它将所有本地min元素保持在特定的时间点,直到下一次推送minStack时,我们可以通过检查堆栈的顶部是否是本地min元素(上面已经介绍过)轻松确定何时从minStack弹出

但是,只有当所有元素都是彼此唯一的时,该方法才能正常工作,否则,将有点困难,提示,使用计数器:。

使用另一个 ack,比如minStack,当推送一个元素val时,检查val是否 现在我们有了一个minStack,它将所有本地min元素保持在特定的时间点,直到下一次推送minStack时,我们可以通过检查堆栈的顶部是否是本地min元素(上面已经介绍过)轻松确定何时从minStack弹出

但是,只有当所有元素都是彼此唯一的时,该方法才能正常工作,否则,这将有点困难,提示,使用计数器:。

免责声明:与ArrayQue一样禁止空值,并且没有严格测试。

导入java.util.ArrayDeque; 公共类悲观策略免责声明:与ArrayQue一样禁止使用空值,并且未经过严格测试。

导入java.util.ArrayDeque;

公共课悲观主义者:嗯,这听起来像是一个面试问题。特别是,这是我申请加入谷歌时遇到的一个面试问题。你试过什么?这里的背景是什么?另外,为了补充@JonSkeet提到的内容,很显然,一点Google ing也会给你很多提示来解决这个问题:按顺序将它们推到堆栈中,每次你需要时peek都会给你最小的元素pop@pwned.. 如果我们不按顺序进行怎么办?嗯,这听起来像是一个面试问题。特别是,这是我申请加入谷歌时遇到的一个面试问题。你试过什么?这里的背景是什么?另外,为了补充@JonSkeet提到的内容,很显然,一点Google ing也会给你很多提示来解决这个问题:按顺序将它们推到堆栈中,每次你需要时peek都会给你最小的元素pop@pwned.. 如果我们不按顺序排列呢?你是在弹出最小元素吗here@KaipaMSarma.. OP问题并不是说我们需要弹出最小元素。。它说,在我从堆栈中弹出一个元素后,我们需要找到最小元素。。我想从这个问题上可以很清楚地看出这一点。我喜欢O1的插入。聪明的叠加。你是在弹出最小元素吗here@KaipaMSarma.. OP问题并不是说我们需要弹出最小元素。。它说,在我从堆栈中弹出一个元素后,我们需要找到最小元素。。我想从这个问题上可以很清楚地看出这一点。我喜欢O1的插入。聪明的堆栈排序。我没有对堆栈进行排序。我维护一个单独的已排序LinkedList。堆栈顺序始终保持不变,不会影响LinkedList顺序,LinkedList顺序仅基于可比较的行为,而完全不基于推送顺序。。。运行示例:@Joe。。是的,你是对的。。刚才看到您正在维护包含内部类条目实例的堆栈。。那是不一样的+1..@Rohit您的插入具有更好的时间复杂性,并且巧妙地利用了堆栈行为,因此我相应地更新了代码,但有一点不同,我不跟踪以前的最小值;我是从偷看照片中得到的head@Joe.. 谢谢:。。我觉得你的代码很好。。这正是我想要它工作的方式。。我喜欢这个实现..我没有对堆栈排序。我维护一个单独的已排序LinkedList。堆栈顺序始终保持不变,不会影响LinkedList顺序,LinkedList顺序仅基于可比较的行为,而完全不基于推送顺序。。。运行示例:@Joe。。是的,你是对的。。刚才看到您正在维护包含内部类条目实例的堆栈。。那是不一样的+1..@Rohit您的插入具有更好的时间复杂性,并且巧妙地利用了堆栈行为,因此我相应地更新了代码,但有一点不同,我不跟踪以前的最小值;我是从偷看照片中得到的head@Joe.. 谢谢:。。我觉得你的代码很好。。这正是我想要它工作的方式。。我喜欢它的实现。。