Retrieving the Min element in a stack in O(1) Time

后端 未结 3 1036
一生所求
一生所求 2021-02-06 09:33

The reason I\'m asking this question is because I cannot see why the way I think cannot be applied to this particular question

\"How would you design a stack which,

相关标签:
3条回答
  • 2021-02-06 10:01

    Use a linked list to keep track of the minimum value which is gonna be the head.

    Note that linkedlist.app= append ( we put the value in the tail ). linkedlist.pre =prepend ( we put the value as the head of the linkedlist)

    public class Stack {

    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();
    
    }
    

    }

    0 讨论(0)
  • 2021-02-06 10:03

    I found this solution here

    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;
    };
    
    0 讨论(0)
  • 2021-02-06 10:06

    This wouldn't work if you popped numbers off the stack.

    Ex. 2,4,5,3,1. After you pop 1 off, what is your minimum?

    The solution is to keep a stack of minimums, not just a single value. If you encounter a value that is less than equal to the current minimum, you need to push it onto the min-stack.

    Ex.

    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
    
    0 讨论(0)
提交回复
热议问题