2016-09-09 5 views
-1

Я пытаюсь решить этот вопрос с помощью Stack из LeetCode, я могу пройти только тесты 14/18 тестов, поскольку тесты недоступны. Я не могу понять, какие крайние случаи отсутствуют. Я новичок в Java, так оцененная помощь :-)Поиск минимального значения из стека

  public class MinStack { 

       private int top; 
       private ArrayList<Integer> stack; 
       private ArrayList<Integer> minStack; 

       /** initialize your data structure here. */ 
       public MinStack() { 
        this.top = -1; 
        this.stack = new ArrayList<Integer>(); 
        this.minStack = new ArrayList<Integer>(); 
       } 

       public void push(int x) { 
        top++; 
        stack.add(x); 
        if(top == 0){ 
         minStack.add(x); 
        } 
        else{ 
         minStack.add(Math.min(minStack.get(top-1), x)); 

        } 
       } 

       public void pop() { 
        stack.remove(stack.get(top)); 
        minStack.remove(minStack.get(top)); 
        top--; 
       } 

       public int top() { 
        if(top >= 0) 
         return stack.get(top); 
        return -1; 
       } 

       public int getMin() { 
        if(top >= 0) 
         return minStack.get(top); 
        return -1; 
       } 
      } 

      /** 
      * Your MinStack object will be instantiated and called as such: 
      * MinStack obj = new MinStack(); 
      * obj.push(x); 
      * obj.pop(); 
      * int param_3 = obj.top(); 
      * int param_4 = obj.getMin(); 
      */ 
+0

Неужели кто-то пытался решить его таким образом? Я считаю, что ему нужно что-то делать, когда Стек пуст или, может быть, нет. – inSynergy

+1

Ваша проблема в том, что вы используете 'remove (Object o)', когда вам просто нужно использовать 'remove (int index)'. – Andreas

+0

Почему вы используете 'ArrayList' для определения стека? Вы можете использовать массив, который является более простым методом. – progyammer

ответ

0
  1. Вы можете использовать Stack<Integer> для стека и length свойство для вершины стека.

  2. stack.remove(Object o) удаляет первое вхождение объекта в структуру данных резервного копирования, ArrayList в вашем случае. Если вы используете Stack<Integer>, просто позвоните stack.pop(). Или вызовите stack.remove(top), если используете ArrayList.

Алгоритм выглядит хорошо для меня.

0

Я думаю, возникает ошибка, когда ваш верхний элемент в стеке был поп и требования пользователей для текущего минимума в стеке ....

Рассмотрим стек поп операций 1,7,3,4 , 2, 8,9. Несомненно, 1 на вершине этого стека является минимальным. Но если вызывается pop, 1 удаляется ... Из-за отсутствия правильной сортировки нет гарантии, что следующий элемент в верхней части стека будет минимальным.

в этой линии

minStack.add (Math.min (minStack.get (топ-1), х));

и пример выше, 1 всегда добавляется в стек, являясь минимальным. Таким образом, когда 1 выскочит, 1 по-прежнему является минимальным в вашем minStack, но должен быть 2 из приведенного выше примера

+0

, но эта строка добавляет минимум, когда я нажимаю элемент, когда я поп-стекю я также pop minStack – inSynergy

+0

Да, он добавляет минимум каждый раз. например, первое нажатие добавит 1; второе нажатие добавит min (1, 7) i.e 1, третий push добавит min (1, 3) еще 1 и т. д. Таким образом, ваш минимальный стек будет иметь только 1 сек. При появлении minStack у вас будет минимальное значение 1. Так как ваш стек заполнен 1 сек – Positive

Смежные вопросы