从o开始刷题(1) - 设计一个有getMin功能的栈

95 阅读1分钟

[程序源代码面试指南第二版] 设计一个有getMin功能的栈

需求:

  1. 栈的基本功能基础上
  2. 返回栈中最小元素操作
  3. pop时间复杂度O(1)
  4. push时间复杂度O(1)
  5. getMin时间复杂度O(1)

解题思路1

  1. 两个栈存放正常数据stackData和存放最小值stackMin

  2. push 数据压入stackData,判断stackMin为空 2.1 如果stackMin为空,那么数据压入stackMin 2.2 如果stackMin不为空,判断新数据和stackMin栈顶元素哪个更小 2.2.1 stackMin更小,则stackMin不压入 2.2.2 新数据更小, push

  3. pop stackData的元素只可能大于等于stackMin 所以value如果大于stackMin时stackMin不用弹出,返回value

  4. getMin 返回stackMin栈顶就是最小值

注意点

  1. getMin()和pop()记得判断为空的清空记得判断异常
  2. push时用到判断当前stackMin当前栈顶 记得服用getMin函数

解题思路2

和思路1的差别在于新数据比stackMin栈顶大时,再压入stackMin的栈顶

附件

解题思路1

public class STACK_getMin {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public STACK_getMin() {
        this.stackData = new Stack<>();
        this.stackMin = new Stack<>();
    }

    public void push(int newNum){
        if(stackMin.isEmpty()){
            stackMin.push(newNum);
        }else{
            //获取栈的顶
            //复用函数
            if(newNum <= getMin()){
                stackMin.push(newNum);
            }
        }

        stackData.push(newNum);

    }

    public Integer pop(){
        // 注意异常
        if(this.stackData.isEmpty()){
            throw new RuntimeException("your stack is empty.");
        }

        int value = this.stackData.pop();
        if(value == this.getMin()){
            this.stackMin.pop();
        }
        return value;

    }

    public Integer getMin(){
        if(this.stackMin.isEmpty()){
            throw new RuntimeException("Your stack is Empty!!!");
        }
        return this.stackMin.peek();
    }

    public Stack<Integer> getStackMin() {
        return stackMin;
    }

    public Stack<Integer> getStackData() {
        return stackData;
    }
}

解题思路2

public class STACK_getMin02 {
    private Stack<Integer> stackData = new Stack();
    private Stack<Integer> stackMin = new Stack();

    public STACK_getMin02() {
    }

    public void push(int newNum) {
        if (this.stackMin.isEmpty()) {
            this.stackMin.push(newNum);
        } else if (newNum <= this.getMin()) {
            this.stackMin.push(newNum);
        } else {
            this.stackMin.push(this.stackMin.peek());
        }

        this.stackData.push(newNum);
    }

    public Integer pop() {
        if (this.stackData.isEmpty()) {
            throw new RuntimeException("your stack is empty.");
        } else {
            int value = (Integer)this.stackData.pop();
            this.stackMin.pop();
            return value;
        }
    }

    public Integer getMin() {
        if (this.stackMin.isEmpty()) {
            throw new RuntimeException("Your stack is Empty!!!");
        } else {
            return (Integer)this.stackMin.peek();
        }
    }

    public Stack<Integer> getStackData() {
        return this.stackData;
    }

    public Stack<Integer> getStackMin() {
        return this.stackMin;
    }
}