155. 最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路是用一个辅助容器存储当前栈的最小值,如果用其他容器,在多次pop和push后,对于最小值的维护很难实现,如果辅助容器和主容器都用一种的话维护起来就会简便许多.目的是主容器在pop和push后,辅助的容器依然能够有效的获取最小值,考虑用辅助栈(在栈顶维护一个最小值):第一次push的时候,主栈和辅助栈都add,之后再push的时候,如果push(x)的值小于辅助栈的顶部元素,辅助站add(x),否则辅助栈就add当前顶部的元素(目的是既要辅助栈内的元素数量和主栈元素数量相等(同步,便于理解,也可以优化出入口条件节俭空间),也要保持辅助栈顶部元素是最小值); pop的时候辅助栈和主栈都pop(理由同上,同步便于理解).

总结:解决问题前先想想各个容器的特点,结合容器的特点和题目的特点,有效的将两者结合在一起

import java.util.Stack;

public class MinStack {

// 数据栈
private Stack data;
// 辅助栈
private Stack helper;

/**
 * initialize your data structure here.
 */
public MinStack() {
    data = new Stack<>();
    helper = new Stack<>();
}

// 思路 1:数据栈和辅助栈在任何时候都同步

public void push(int x) {
    // 数据栈和辅助栈一定会增加元素
    data.add(x);
    if (helper.isEmpty() || helper.peek() >= x) {
        helper.add(x);
    } else {
        helper.add(helper.peek());
    }
}

public void pop() {
    // 两个栈都得 pop
    if (!data.isEmpty()) {
        helper.pop();
        data.pop();
    }
}

public int top() {
    if(!data.isEmpty()){
        return data.peek();
    }
    throw new RuntimeException("栈中元素为空,此操作非法");
}

public int getMin() {
    if(!helper.isEmpty()){
        return helper.peek();
    }
    throw new RuntimeException("栈中元素为空,此操作非法");
}

}

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/min-stack/solution/shi-yong-fu-zhu-zhan-tong-bu-he-bu-tong-bu-python-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode)