一、題目描述
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。
注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。
二、問題分析
剛看到這個題的時候不太懂這道題的目的是什麼,定義棧的數據結構,拿Java來說,utils包下不是有Stack棧的定義嗎?再一看是要實現找到棧中最小元素的min函數。這下清楚了,原來是對棧數據結構的改進,自然而然想到只需要定義一個min()函數,然後遍歷完棧找到最小值返回,但是之後看別人的代碼才意識到這道題沒那麼簡單,題目的附加要求是時間複雜度爲O(1)。而遍歷棧時間複雜度就成了O(n),不符合題目要求。
那就只能犧牲空間換時間了,額外定義一個輔助棧,使得該棧與原來的棧同步壓棧,出棧(之所以同步是要保證出一個棧還能保證該輔助棧有數據)。示意圖如下:
有了輔助棧接下來的工作就簡單了,代碼如下:
代碼:
import java.util.Stack;
public class Solution {
Stack<Integer> normal = new Stack<Integer>(); // 操作棧
Stack<Integer> minval = new Stack<Integer>(); // 輔助棧
public void push(int node) {
normal.push(node); // 操作棧壓入元素
if(minval.empty()){ // 如果輔助棧爲空,則壓入該元素
minval.push(node);
}else if(node > minval.peek()){ // 如果該元素大於輔助棧棧頂元素,則壓入棧頂元素即可
minval.push(minval.peek());
}else{ // 否則,壓入該元素
minval.push(node);
}
}
public void pop() {
normal.pop();
minval.pop();
}
public int top() {
return normal.peek();
}
public int min() { // 輔助棧棧頂元素即爲要求最小元素
return minval.peek();
}
}
總結
遇到問題不要急着去寫代碼,寫審題,看清楚條件,然後再想解題思路,最後再寫代碼。