437,劍指 Offer 包含min函式的棧

2021-10-09 13:27:54 字數 2649 閱讀 2670

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 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,pop,top,min四個函式。這題和官方的stack相比就多了乙個min函式。棧的實現我們可以使用鍊錶,先來定義乙個鍊錶類

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棧頂數字入棧。以...