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是否公共课悲观主义者:嗯,这听起来像是一个面试问题。特别是,这是我申请加入谷歌时遇到的一个面试问题。你试过什么?这里的背景是什么?另外,为了补充@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.. 谢谢:。。我觉得你的代码很好。。这正是我想要它工作的方式。。我喜欢它的实现。。