7

我问这个问题的原因是因为我不明白为什么我认为的方式不能应用于这个特定问题

“你会如何设计一个堆栈,除了 push 和 pop,还有一个函数 min 可以返回最小元素?push、pop 和 min 都应该在 O(1) 时间内运行

我的基本解决方案:如果我们在堆栈类中有一个变量,那么当我们将一个项目推入堆栈时,我们会检查它是否小于我们的最小变量。如果将值分配给最小值,则忽略。

你仍然会得到 O(1) 作为 min 函数;

int getMinimum(){
  return min;
}

为什么从未提及此解决方案,或者我的想法有什么问题?

4

3 回答 3

26

如果您从堆栈中弹出数字,这将不起作用。

前任。2,4,5,3,1。在您弹出 1 次后,您的最低限额是多少?

解决方案是保留一堆最小值,而不仅仅是一个值。如果遇到小于等于当前最小值的值,则需要将其压入最小堆栈。

前任。

Push(4):
Stack: 4
Min-stack: 4

Push(2):
Stack: 4 2
Min-stack: 4 2

Push(2):
Stack: 4 2 2
Min-stack: 4 2 2

Push(5):
Stack: 4 2 2 5
Min-stack: 4 2 2

Push(3):
Stack: 4 2 2 5 3
Min-stack: 4 2 2

Push(1):
Stack: 4 2 2 5 3 1
Min-stack: 4 2 2 1

Pop():
Stack: 4 2 2 5 3
Min-stack: 4 2 2

Pop():
Stack: 4 2 2 5
Min-stack: 4 2 2

Pop():
Stack: 4 2 2
Min-stack: 4 2 2

Pop():
Stack: 4 2
Min-stack: 4 2

Pop():
Stack: 4
Min-stack: 4
于 2012-11-04T22:27:36.007 回答
1

使用链表来跟踪将成为头部的最小值。

请注意,linkedlist.app= append (我们将值放在尾部)。linkedlist.pre =prepend (我们把值作为链表的头部)

公共类堆栈{

int[] elements;
int top;
Linkedlists min;

public Stack(int n) {
    elements = new int[n];
    top = 0;
    min = new Linkedlists();
}

public void realloc(int n) {
    int[] tab = new int[n];
    for (int i = 0; i < top; i++) {
        tab[i] = elements[i];
    }

    elements = tab;
}

public void push(int x) {
    if (top == elements.length) {
        realloc(elements.length * 2);
    }
    if (top == 0) {
        min.pre(x);
    } else if (x < min.head.data) {
        min.pre(x);
    } else {
        min.app(x);
    }
    elements[top++] = x;
}

public int pop() {

    int x = elements[--top];
    if (top == 0) {

    }
    if (this.getMin() == x) {
        min.head = min.head.next;
    }
    elements[top] = 0;
    if (4 * top < elements.length) {
        realloc((elements.length + 1) / 2);
    }

    return x;
}

public void display() {
    for (Object x : elements) {
        System.out.print(x + " ");
    }

}

public int getMin() {
    if (top == 0) {
        return 0;
    }
    return this.min.head.data;
}

public static void main(String[] args) {
    Stack stack = new Stack(4);
    stack.push(2);
    stack.push(3);
    stack.push(1);
    stack.push(4);
    stack.push(5);
    stack.pop();
    stack.pop();
    stack.pop();
    stack.push(1);
    stack.pop();
    stack.pop();
    stack.pop();
    stack.push(2);
    System.out.println(stack.getMin());
    stack.display();

}

}

于 2017-02-26T09:14:44.313 回答
0

我在这里找到了这个解决方案

struct StackGetMin {
  void push(int x) {
    elements.push(x);
    if (minStack.empty() || x <= minStack.top())
      minStack.push(x);
  }
  bool pop() {
    if (elements.empty()) return false;
    if (elements.top() == minStack.top())
      minStack.pop();
    elements.pop();
    return true;
  }
  bool getMin(int &min) {
    if (minStack.empty()) {
      return false;
    } else {
      min = minStack.top();
      return true;
    }
  }
  stack<int> elements;
  stack<int> minStack;
};
于 2014-10-09T04:27:45.513 回答