Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 以这样的方式实现堆栈,以便我们可以在O(1)中找到最小值_Java_C_Algorithm_Data Structures - Fatal编程技术网

Java 以这样的方式实现堆栈,以便我们可以在O(1)中找到最小值

Java 以这样的方式实现堆栈,以便我们可以在O(1)中找到最小值,java,c,algorithm,data-structures,Java,C,Algorithm,Data Structures,面试问题: 我们想找出堆栈中的最小元素。 所以,以这样的方式实现堆栈,它将在O(1)中的任何时间点为我提供最小元素 还有一个条件,求最小元素的空间复杂度应该是O(1) 时间复杂性: 推送操作:O(1) Pop操作:O(1) 获取最小元素:O(1) 如何做到这一点 比如说,, 推(2) 堆栈: 2正如其他人所提到的,空间复杂度天生就是O(n),但对于这样的问题,一个简单的答案就是让push和pop做更多的工作,并且比通常更低效 因此,在堆栈中添加一个int minVal,然后在任何时候按下或弹出,

面试问题: 我们想找出堆栈中的最小元素。 所以,以这样的方式实现堆栈,它将在O(1)中的任何时间点为我提供最小元素 还有一个条件,求最小元素的空间复杂度应该是O(1)

时间复杂性:

推送操作:O(1)

Pop操作:O(1)

获取最小元素:O(1)

如何做到这一点

比如说,, 推(2)

堆栈:


2正如其他人所提到的,空间复杂度天生就是O(n),但对于这样的问题,一个简单的答案就是让push和pop做更多的工作,并且比通常更低效

因此,在堆栈中添加一个
int minVal
,然后在任何时候按下或弹出,只需更新与按下或弹出的内容相关的值。因此,如果我们的最小值是1,我们弹出1,那么我们再次在整个堆栈中寻找最小值。同样,如果我们按0,但我们的最小值当前为1,我们将最小值设置为0

这使得
getMin()
O(1)
但其他函数的效率较低-这仍然符合问题的规则


当然,有更好的方法来最小化对push/pop的影响,但这会扩大空间。

保留一个最小值,并创建另一个堆栈,一个跟踪先前最小值的堆栈


至于空间复杂度,我不知道如何解决这个问题,除非n==1,否则idk如何获得O(1)个空间

用第二个值为堆栈中的每个元素
x
,表示为
mb(x)
。然后当你按下
x
时,你设置
mb(x)=min{x,mb(x下面的元素)}
,这就是它的全部内容


如果这违反了空间约束(可以合理地解释为,只有求最小值的操作必须具有恒定的空间复杂度,否则您可以使用任意多的额外空间,即堆栈本身的空间要求是无限的),然后Eric的回答将解决这个问题。

我不确定是否遗漏了任何内容,但是如果您有
n
元素,您会期望空间复杂度为
n
否?如果您希望
n
始终为
1
,那么最多只能有一项,在这种情况下,获取最小项将始终分解为检查第一个元素,这可以在恒定的时间内完成。堆栈的空间复杂度为O(n),因此无法满足第二个要求,O(n)==O(1)如果堆栈大小为XD1,您忘记问问题了!你确定他们没有说使用堆栈来跟踪最小值吗?比如数组之类的?我觉得搜索一个新的最小部分的整个过程可以很容易地避免,只需保留两个变量,一个用于最小,另一个用于下一个smalledst@that-RU551一个家伙,但是如果你
pop
最小值和次最小值,您将不知道如何使新的最小值。@Eric:在执行pop操作后,如果您在整个堆栈中找到最小值,则时间复杂度将是O(n)。O.O跟踪堆栈的堆栈;)@用户3078630是的。。。正如我已经说过的。。。但是唯一的要求是
getMin()
O(1)
生成另一个堆栈意味着O(n)