20 包含min函式的棧

2021-10-03 06:10:43 字數 1503 閱讀 9898

題目鏈結

題目描述

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

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

從之前兩個棧實現佇列,到實現帶有min棧的功能。我發現了乙個特點,想在棧的基礎上增加或者改變功能,我們可以從增加乙個輔助棧入手。

題目要求時間複雜度o(1)min演算法,並不能暴力的保留棧每次push或pop操作之後的min值。

我們設立乙個主棧s1,輔助棧s2。我們定義輔助棧保留我們所需要的最小值序列,保證輔助棧的top值總是棧push或者pop操作情況下的min值。

首先將value放入主棧

這樣在一系列push操作後,主棧包含所有push元素,輔助棧會存有從過程中的最小值序列。

例如push(4,3,5,2,7,1) 主棧(4,3,5,2,7,1) 輔助棧(4,3,2,1)

我們保證了輔助棧的top值是任意過程的min值。在pop之前

例如 主棧(4,3,5,2,7,1) 輔助棧(4,3,2,1)

pop第一次,主棧(4,3,5,2,7,1) 輔助棧(4,3,2)

pop第二次,主棧(4,3,5,2) 輔助棧(4,3,2)

在push和pop操作我們為帶有min棧實現了基礎,top操作可直接返回主棧的top值

min操作直接返回當前情況的min值也就是輔助棧的top元素。從而實現了min演算法時間複雜度o(1)。

class solution 

else

if(value < s2.

top())

}void

pop(

)else

}int

top(

)int

min()}

;

以空棧到(4,3,5,2,7,1)的push過程為例。min為最小值,top為棧頂值,stack儲存top與上一過程min的差值。

push

mintop

stack44

4033

3-153

5222

2-172

7511

1-1我們記錄min最小值,top棧頂值,棧儲存差值便可以記錄min值,從而可以節省乙個棧的空間。

class solution 

// 儲存入棧值與最小值的差值

s.push

(value - ans)

;// 更新最小值

ans = ans < value ? ans : value;

// 記錄入棧值

t = value;

}void

pop(

) s.

pop();

t = t <

0? ans - t: ans;

}int

top(

)int

min()}

;

20 包含min函式的棧

思路1 選用存放資料的棧s和存放當前最小值的輔助棧mins,當s記憶體入比當前最小值還小的樹,則該數字入輔助棧,若存放值比當前最小值大,則再次存入當前最小值到輔助棧 這樣mins存在冗餘資訊,可進一步改進。1 class solution else void pop int top int min ...

20 包含min函式的棧

題目 定義乙個棧的資料結構,請在該型別中實現乙個能夠得到棧中最小元素的min函式 思路 可以使用兩個棧,乙個儲存資料,乙個儲存棧中的最小元素。例如 定義兩個棧stack1和stack2,將4壓入stack1,stack2為空,同時將4壓入stack2 然後將2壓入stack1,這時stack1的最小...

20 包含min函式的棧

題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 python class solution def init self self.stack 用於存放對應棧元素所在位置及之前元素最小值 self.assist defpush self,no...