劍指Offer 20 包含min函式的棧

2021-10-06 18:33:12 字數 1277 閱讀 6355

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式(時間複雜度應為o(1))。

注意:保證測試中不會當棧為空的時候,對棧呼叫pop()或者min()或者top()方法。

第一反應:每次壓入乙個新元素進棧時,將棧裡的所有元素排序,讓最小的元素位於棧頂,這樣就能在o(1)時間得到最小元素。但是不能保證最後壓入棧的元素能夠最先出棧,這個資料結構已經不是棧了。

在棧裡新增乙個成員變數存放最小的元素。每次壓入乙個新元素進棧的時候,如果該元素比當前最小的元素還要小,則更新最小元素。乙個問題,如果當前最小的元素被彈出棧了,如何得到下乙個最小的元素呢?

當最小元素被彈出棧的時候,我們希望能夠得到次小元素,因此在壓入這個最小元素之前,要把次小元素儲存起來。

把每次的最小元素都儲存起來放到另外乙個輔助棧裡呢?

首先往空的資料棧裡壓入陣列3,顯然現在3是最小值,也把這個最小值壓入輔助棧。接下來往資料棧裡壓入數字4,由於4大於之前的最小值,因此我們仍然往輔助棧裡壓入數字3。第三步繼續往資料棧裡壓入數字2,由於2小於之前的最小值3,把最小值更新為2,並把2壓入輔助棧。同樣當壓入數字1時,也要更新最小值,並把新的最小值1壓入輔助棧。

如果每次都把最小元素壓入輔助棧,那麼就能保證輔助棧的棧頂一直都是最小元素。當最小元素從資料棧內被彈出之後,同時彈出輔助棧的棧頂元素,輔助棧的新棧頂元素就是下乙個最小值。

三個關鍵函式push,pop和min。m_data是資料棧,m_min是輔助棧

# -*- coding:utf-8 -*-

class solution:

def __init__(self):

self.stack =

self.min_stack =

def push(self, node):

# write code here

if not self.min_stack or node <= self.min_stack[-1]:

def pop(self):

# write code here

if self.stack[-1] == self.min_stack[-1]:

self.min_stack.pop()

self.stack.pop()

def top(self):

# write code here

return self.stack[-1]

def min(self):

# write code here

return self.min_stack[-1]

《劍指offer》20 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式。c 實現 思路 應用乙個輔助棧,壓的時候,如果a棧的壓入比b棧壓入大,b棧不壓,小於等於,ab棧同時壓入,出棧,如果,ab棧頂元素不等,a出,b不出。class solution void pop int top int m...

劍指offer 20 包含min函式的棧

主流想法 在看到這道題目的時候第一反應是要用乙個最小值來保留當前棧中最小值,但是也能夠很快地意識到比較麻煩的地方在於pop的時候怎麼更新min值,看了別人的題解之後都是使用了另外乙個棧來保持在入棧過程中曾經做過最小值的值,pop的時候判斷兩個棧頂元素是否一致,一致的話都要pop,在這種情況下取最小值...

劍指offer20 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 對於乙個棧來說,要找到其中的最小值需要遍歷整個棧,時間複雜度為o n 既然要求要o 1 的時間複雜度,就只能考慮用空間來換時間了。那麼已經決定用空間來換時間,下一步就是確定考慮怎麼使用輔助空間。這個輔助...