【LeetCode-面試演算法經典-Java實現】【155-Min Stack(最小棧)】
阿新 • • 發佈:2019-01-27
原題
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.
題目大意
設計一個棧,支援push,pop,top,和查詢最小的元素操作(常量時間)
解題思路
使用一個輔助棧來儲存棧中的最小元素。
程式碼實現
演算法實現類
public class MinStack {
private final static int DEFAULT_SIZE = 1000;
private int[] stack;
private int[] minIndex; // 用於儲存前n個數據的棧中最小元素的下標
private int min = Integer.MAX_VALUE; // 用於記錄插入過程中的最小資料
private int index = -1; // 記錄最小元素在stack中的位置
private int current = -1;
public MinStack() {
stack = new int[DEFAULT_SIZE];
minIndex = new int[DEFAULT_SIZE];
}
public MinStack(int size) {
stack = new int[size];
minIndex = new int[size];
}
public void push(int x) {
current++; // 移動到要插入的位置
if (current >= stack.length) { // 擴容
int[] tmp = new int[current * 2];
System.arraycopy(stack, 0, tmp, 0, stack.length);
stack = tmp;
tmp = new int[current * 2];
System.arraycopy(minIndex, 0, tmp, 0, minIndex.length);
minIndex = tmp;
}
stack[current] = x; // 插入資料
if (x < min) { // 儲存插入的最小值
min = x;
index = current; // 記錄[0, current]中最小的元素下標是index
}
minIndex[current] = index;
}
public void pop() {
current--;
if (current >= 0) {
min = stack[minIndex[current]]; // 重新設定棧中的最小值
index = minIndex[current]; // 重置最小值的索引
}
}
public int top() {
if (current < 0) {
throw new RuntimeException("No more data");
}
return stack[current];
}
public int getMin() {
if (current < 0) {
throw new RuntimeException("No more data");
}
return stack[minIndex[current]];
}
}
評測結果
點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。