零、簡介
- 記錄 左程雲 大神的 程序員代碼面試指南 一書裏面的算法實現。
- 代碼路徑: https://github.com/1956025812/algorithm
- 2020年開始每週一道算法,成就自己的算法之路~
一、題目
- 題目: 實現一個具有getMin功能的棧。
- 要求: pop、push、getMin的時間複雜度都是o(1)。可以使用現有的棧結構。
二、實現思路
- 內部定義另一個臨時棧,始終存放最小值即可。
- push數據的時候,與臨時棧棧頂元素比較,如果小於或等於,則同步push到臨時棧的棧頂;
- pop數據的時候,與臨時棧棧頂元素比較,如果一樣,則同步將臨時棧的數據pop出來;
- getMin功能,臨時棧的棧頂元素始終都是最小值,一個pop操作的複雜度就是o(1);
三、案例
3.1 代碼
package day20200101;
import java.util.Stack;
/**
* 題目: 設計一個有getMin功能的棧
* 要求:
* 1. pop、push、getMin的時間複雜度都是o(1)
* 2. 設計的棧類型可以使用現成的棧結構
* <p>
* 思路:
* 構造一個臨時的棧,用來存放最小的數據。
* push數據的時候與臨時棧的棧頂元素做比較,如果小於或等於,就放到臨時棧。注意: 小於和等於都要放。
* pop數據的時候與臨時棧的棧頂元素做比較,如果一樣,則同步pop
*/
public class MyMinStack {
private Stack<Integer> dataStack;
private Stack<Integer> tempStack;
public MyMinStack() {
this.dataStack = new Stack<>();
this.tempStack = new Stack<>();
}
/**
* push方法
*
* @param data 新數據
*/
public void push(Integer data) {
dataStack.push(data);
if (tempStack.isEmpty()) {
tempStack.push(data);
} else {
if (data <= tempStack.peek()) {
tempStack.push(data);
}
}
}
/**
* pop方法
*
* @return 棧頂元素
*/
public Integer pop() {
if (dataStack.isEmpty()) {
throw new RuntimeException("當前棧dataStata沒有數據");
}
// 如果要pop的元素正好是最小元素,則要同時一起將臨時棧的元素pop
Integer popData = dataStack.peek();
if (popData.equals(tempStack.peek())) {
tempStack.pop();
}
return dataStack.pop();
}
/**
* getMin方法
*
* @return 棧的最小元素
*/
public Integer getMin() {
if (tempStack.isEmpty()) {
throw new RuntimeException("當前棧dataStata沒有數據");
}
return tempStack.pop();
}
public static void main(String[] args) {
MyMinStack myMinStack = new MyMinStack();
myMinStack.push(3);
myMinStack.push(2);
myMinStack.push(3);
myMinStack.push(6);
myMinStack.push(1);
System.out.println(myMinStack.getMin());
myMinStack.pop();
System.out.println(myMinStack.getMin());
}
}
3.2 測試
1
2