Cracking Coding Interview - 3.2 Stack Min

Stack Min: How would you design a stack which, in addition to push and pop, has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time.

Hints:#27, #59, #78

解答

如果在stack里放一个min属性用来跟踪min,那么push的时候min到还好说,但是pop的时候要把次min的恢复出来就麻烦了。

弄两个stack,一个正常存储value,另一个只存储min values。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class StackMin {
  private Stack<Integer> num = new Stack<>();
  private Stack<Integer> min = new Stack<>();
  public void push(Integer value) {
    if (num.isEmpty()) {
      num.push(value);
      min.push(value);
      return;
    }
    if (value <= min.peek()) {
      // 只存比当前min更小的数字,这里用<=是为了应对连续push相同数字的情况
      min.push(value);
    }
    num.push(value);
  }
  public Integer pop() {
    Integer val = num.pop();
    if (val.equals(min.peek())) {
      // 如果pop了最小值,那么min也
      min.pop();
    }
    return val;
  }
  public Integer min() {
    return min.peek();
  }
}

版权

评论