算法练习(五):包含 min 函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
解题思路:
标准栈提供了push、top、pop的函数,可以做到时间复杂度是O(1),但是无法支持min函数时间复杂度是O(1);所以该算法核心是要保证min函数时间复杂度是O(1),使用一个额外栈保存最小值,并每次push与pop保证数据同步。
package Algriothm;
import java.util.Stack;
public class MinStack {
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
System.out.println(minStack.min());
minStack.pop();
System.out.println(minStack.top());
System.out.println(minStack.min());
}
Stack<Integer> A = null;
Stack<Integer> B = null;
/**
* initialize your data structure here.
*/
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
// 空时,任何元素都是最小值。非空时,仅保存比当前元素小的数
if (B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
// 如果是最小值弹出,则A、B都需要进行弹出操作
if (A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
浙公网安备 33010602011771号