任何人都可以帮我解决这个问题的算法(面试问题):
你有一个堆栈。设计算法以找到最大数量 仅使用PUSH / POP操作。
答案 0 :(得分:4)
鉴于原帖中缺少约束,您可以弹出所有数据并计算运行最大值:
if empty(st) -> raise exception
m <- pop(st)
while not empty(st)
n <- pop(st)
if n > m
m <- n
编辑(使用原始堆栈未更改的新限制以及第二个可用堆栈的新资源):
if empty(st) -> raise exception
m <- pop(st)
push(alt_st, m)
while not empty(st)
n <- pop(st)
push(alt_st, n)
if n > m
m <- n
while not empty(alt_st):
n <- pop(alt_st)
push(st, n)
答案 1 :(得分:2)
因为原始堆栈不能是只读的(Pop
,访问数据的唯一方法,也修改堆栈),我们必须考虑“堆栈应该不变”限制意味着我们必须我们完成后将其恢复到原始状态。
我们可以通过在Raymond Hettinger提出的方法中使用另一个堆栈来实现它:
int get_max_from_stack(Stack stack) {
int M = stack.pop();
Stack aux;
aux.push(M);
while (!stack.empty()){
int tmp = stack.pop();
aux.push(tmp);
M = max(M, tmp);
};
while (!aux.empty())
stack.push(aux.pop());
return M;
};
答案 2 :(得分:1)
有两种方法可以解决这个问题,要么你可以创建一个函数get_max
来给出堆栈中的最大数量,或者你可以保留一些额外的信息,你可以使用它们给出堆栈中的最大数量在O(1)
操作中但以extra space
为代价。我会给你后一个解决方案。
对于堆栈的任何配置,您需要做的是使extra stack
堆栈的最大元素位于顶部。
max_stack
执行以下操作,将当前值与max_stack顶部进行比较,然后将更大的数字推入其中。max_stack
max
值时,只需从max_stack
中选择堆栈顶部。这样,您可以在O(1)
时间内获得最大数量,并且推送和弹出操作也会保持O(1)
。我可以给你代码,但它没有什么,因为它是直截了当的。例如,如果您按顺序推送以下数字
5 - 2 - 6 - 8 - 1
max_stack
将包含
5 - 5 - 6 - 8 - 8
以及pop
的数字,当前max
将位于顶部。
我希望解决方案很明确。