摘要:雙棧法復(fù)雜度時(shí)間空間思路暴力的方法是遍歷一遍棧得出最小值,這樣不用任何空間。因?yàn)檫@個(gè)最小值的順序也是先進(jìn)后出,我們同樣用一個(gè)棧來記錄。這樣主棧在時(shí),如果該值小于等于副棧頂,就也進(jìn)副棧中。當(dāng)主棧時(shí),如果出的元素是副棧棧頂?shù)脑?,副棧也要?/p>
Min Stack
Design a stack that supports push, pop, top, and retrieving the雙棧法 復(fù)雜度
minimum element in constant time.push(x) -- Push element x onto stack.
pop() -- Removes the element on
top of the stack. top() -- Get the top element. getMin() -- Retrieve
the minimum element in the stack.
時(shí)間 O(N) 空間 O(1)
思路暴力的方法是遍歷一遍棧得出最小值,這樣不用任何空間。但如果我們能使用空間來記錄到目前為之最小的數(shù)呢?我們只要記錄一個(gè)最小數(shù)的順序,和棧的操作順序?qū)?yīng)起來就可以在任何時(shí)候做到O(1)獲取最小值了。因?yàn)檫@個(gè)最小值的順序也是先進(jìn)后出,我們同樣用一個(gè)棧來記錄。這樣主棧在push時(shí),如果該值小于等于副棧頂,就也push進(jìn)副棧中。當(dāng)主棧pop時(shí),如果pop出的元素是副棧棧頂?shù)脑挘睏R惨猵op。
注意判斷是否加入副棧時(shí),等于的情況也要加入,因?yàn)榭赡苡卸鄠€(gè)重復(fù)的最小值,我們也需要多次拋出這些重復(fù)的最小值
當(dāng)棧為空時(shí),peek會(huì)拋出異常,這里要和面試官溝通好如何處理?xiàng)榭盏那闆r
代碼class MinStack { Stackstk = new Stack (); Stack min = new Stack (); public void push(int x) { stk.push(x); if(min.isEmpty() || x <= min.peek()){ min.push(x); } } public void pop() { int x = stk.pop(); if(!min.isEmpty() && min.peek() == x){ min.pop(); } } public int top() { if(!stk.isEmpty()){ return stk.peek(); } else { return 0; } } public int getMin() { if(!min.isEmpty()){ return min.peek(); } else { return 0; } } }
2018/2
class MinStack: def __init__(self): """ initialize your data structure here. """ self.mins = [] self.values = [] def push(self, x): """ :type x: int :rtype: void """ self.values.append(x) if not self.mins or x <= self.mins[-1]: self.mins.append(x) def pop(self): """ :rtype: void """ result = self.values.pop() if self.values else None if result is not None and self.mins and result == self.mins[-1]: self.mins.pop() def top(self): """ :rtype: int """ return self.values[-1] if self.values else None def getMin(self): """ :rtype: int """ return self.mins[-1] if self.mins else None后續(xù) Follow Up
Q:如果還要加一個(gè)getMax()方法呢?
A:同樣用一個(gè)棧,但是入棧的判斷條件是大于等于棧頂。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64525.html
摘要:刪除棧頂?shù)脑???梢粤硗庑陆ㄒ粋€(gè)棧來順序存入數(shù)據(jù)最小值。另外在數(shù)據(jù)入棧時(shí)需要判斷該值是否比輔助棧的棧頂元素的值更小,如果更小,也應(yīng)該將它加入輔助棧。并且需要判斷輔助棧是否為空,在不空的條件下才可以取棧頂元素比較,否則會(huì)溢出。 LeetCode 155:最小棧 Min Stack 設(shè)計(jì)一個(gè)支持 push,pop,top 操作,并能在常數(shù)時(shí)間內(nèi)檢索到最小元素的棧。 push(x) -- ...
摘要:題目地址題目描述設(shè)計(jì)一個(gè)支持,,操作,并能在常數(shù)時(shí)間內(nèi)檢索到最小元素的棧。將元素推入棧中。刪除棧頂?shù)脑?。示例返回返回返回解答每次入棧都放入兩個(gè)元素,分別是當(dāng)前元素,和當(dāng)前的最小元素因此放入之前需要和當(dāng)前值進(jìn)行比較。 題目地址:https://leetcode-cn.com/probl...題目描述:設(shè)計(jì)一個(gè)支持 push,pop,top 操作,并能在常數(shù)時(shí)間內(nèi)檢索到最小元素的棧。 p...
摘要:如果繼續(xù)降序,說明又向左走了,這樣等到下次向右走得時(shí)候也要再次更新最小值。這樣,序列無效的條件就是違反了這個(gè)最小值的限定。我們同樣可以用本題的方法解,不過是從數(shù)組的后面向前面遍歷,因?yàn)樵诤竺媪?。棧的增長方向也是從高向低了。 Verify Preorder Sequence in Binary Search Tree Given an array of numbers, verify ...
摘要:復(fù)雜度思路維護(hù)一個(gè)里面有最大值和最小值。如果當(dāng)前值小于的最小值,那么就將原來的壓進(jìn)去棧,然后在用這個(gè)新的的值再進(jìn)行更新。如果沒有適合返回的值,就重新更新當(dāng)前的。 Leetcode[132] Pattern Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak ...
摘要:在線網(wǎng)站地址我的微信公眾號完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個(gè)題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號: showImg(htt...
閱讀 2894·2021-11-24 09:39
閱讀 3151·2021-11-19 10:00
閱讀 1552·2021-10-27 14:17
閱讀 1822·2021-10-14 09:43
閱讀 978·2021-09-03 10:30
閱讀 3423·2019-08-30 15:54
閱讀 2748·2019-08-30 13:05
閱讀 2021·2019-08-30 11:02