定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min、push 及 pop 的時間複雜度都是 o(1)。
示例:
minstack minstack = new minstack();使用輔助類解決這道題讓我們自定義乙個棧,有push,pop,top,min四個函式。這題和官方的stack相比就多了乙個min函式。棧的實現我們可以使用鍊錶,先來定義乙個鍊錶類minstack.push(-2);
minstack.push(0);
minstack.push(-3);
minstack.min(); --> 返回 -3.
minstack.pop();
minstack.top(); --> 返回 0.
minstack.min(); --> 返回 -2.
class
listnode
}
這裡對鍊錶的操作永遠都是鍊錶的頭,假如往棧中加入3→2→5→4,畫個圖來看一下使用鍊錶怎麼操作的
**比較簡單,來看下
class
minstack
//出棧,相當於把煉表頭刪除
public
void
pop(
)//棧頂的值也就是煉表頭的值
public
inttop()
//鍊錶中頭結點儲存的是整個鍊錶最小的值,所以返回head.min也就是
//相當於返回棧中最小的值
public
intmin()
//判斷棧是否為空
private
boolean
empty()
}
上面解決方式是使用乙個輔助的類,實際上如果使用輔助類,我們也可以使用官方提供的棧,像下面這樣。
class
minstack
else
}//出棧
public
void
pop(
)public
inttop()
public
intmin()
//判斷棧是否為空
private
boolean
empty()
}class
stacknode
}
使用單個棧解決也可以使用官方提供的棧,當壓棧的值小於棧中最小值時,先把最小值入棧,然後再把需要壓棧的值入棧,最後再更新棧中最小值。如果壓棧的值大於棧中最小值的時候,直接壓棧,這裡就以[6,2,1,4]分別入棧來看一下
這是壓棧的過程,出棧的時候如果出棧的值等於最小值,說明最小值已經出棧了,要更新最小值,估計直接看**會更明白一些
class
minstack
stack.
push
(x);
}public
void
pop(
)public
inttop()
public
intmin()
}
這種方式雖然也能解決,但如果壓棧的值一直遞減的話,棧中會壓入很多的min,實際上我們還可以在改一下,棧中壓入的是需要壓棧的值和最小值的差值,這樣就不會壓入min了,看下**
public
class
minstack
else
}public
void
pop(
)public
inttop()
else
}public
intmin()
}
使用雙棧解決這個**比較簡潔,就不在說了,直接看下**
class
minstack
public
void
pop(
)public
inttop()
public
intmin()
}
問題分析這道題解法比較多,不算太難,棧的實現也可以有多種方式。
劍指offer 包含min 的棧
分析 關於棧的push pop top 方法都是和普通棧一樣,就是得到棧中最小元素min 方法不一樣。假如我們對每次push進棧的元素進行排序,使得最小的元素位於棧頂,那麼就可以在o 1 時間複雜度內實現min 方法。但單純這樣子不能保證pop,top等方法是按照棧的先入後出的規定。換言之,此時則不...
劍指offer 包含min的棧
思路 該題主要是補充棧的min方法,例如 棧有pop push peek等內建方法,每次呼叫這些方法就能返回個結果或者有個響應,本題意在補充min方法,使得每次呼叫min方法都能得到棧中最小值,保證每次執行過min 函式後棧中元素不變。push 6 min 返回6 push 7 min 返回6,pu...
劍指offer 包含min函式的棧
一 問題描述 二 思路 兩個棧,乙個當前棧data,乙個輔助棧m min,輔助棧用來儲存當前的最小值,如果出棧,輔助棧也出棧,棧頂元素始終是當前的最小值。在入棧時,如果輔助棧為空或者當前值小於輔助棧棧頂元素,則將當前值加入輔助棧 否則將輔助棧的棧頂元素加入輔助棧,表明此次有大於min棧頂數字入棧。以...