方法:1.使用兩個棧 stackdata,stackmin,乙個記錄資料,另乙個棧確保棧頂是當前資料棧的最小元素
2.入棧:若stackmin空,則直接入,否則如果當前元素小於等於棧頂元素,入棧,否則,不入。
3.出棧:如果從stackdata出來的元素於當前stackmin元素棧頂相同,stackmin進行一次出棧。
private stackstack=new stack<>();private stackmin=new stack<>();
public
void push(int
node)
public
void
pop()
public
inttop()
public
intmin()
問題:用兩個棧結構實現佇列,支援佇列的基本操作(push,pop,peek)
方法:使用乙個棧壓入,使用另乙個棧彈出。如佇列1 2 3 4 5,壓入棧時依次入棧,
在棧內就是1 2 3 4 5 ,5是棧頂,將此棧元素倒入另乙個棧,
在棧內就是5 4 3 2 1,1是棧頂,依次出棧就是乙個佇列。
要點:將元素從壓入棧倒入彈出棧時,需確保彈出棧為空且壓入棧已全部倒入。
方法:1.使用乙個get函式,每次取得並移除棧底元素,其他元素順序不變。
2.使用乙個reverse函式,每一層都呼叫一次get,當每一層返回時,將get得到的元素入棧,最後即得到逆序棧。
publicint get(stackstk)
return
last;
}public
void reverse(stackstk)
分析:類似於第乙個帶最值的棧的問題,使用乙個輔助棧,
從資料棧依次彈出元素,如果不大於輔助棧棧頂,則入輔助棧,否則,依次從輔助棧彈入到資料棧,直到能夠入輔助棧。
最後資料棧全部壓入輔助棧,則將輔助棧全部倒入資料棧,完成排序。
問題描述:
有乙個整型陣列 arr 和乙個大小為 w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置。 返回乙個長度為n-w+1的陣列res,res[i]表示每一種視窗狀態下的最大值。 以陣列為[4,3,5,4,3,3,6,7],w=3為例。因為第乙個視窗[4,3,5]的最大值為5,第二個視窗[3,5,4]的最大值為5,第五個視窗[3,3,6]的最大值為6。第六個視窗[3,6,7]的最大值為7。所以最終返回[5,5,5,4,6,7]。
分析:1.普通方法遍歷每個視窗,則時間複雜度為o(n*w)。
2.利用乙個雙端佇列,儲存最近乙個視窗內出現的最大值,其中佇列內元素按降序排列。
方法:以上題為例,遍歷陣列,當隊列為空時,則將當前下標i入隊,如果隊內有元素,則當隊尾下標對應的元素比要入隊的下標對應的元素大時,直接入隊,
否則隊內元素出隊,直接可入隊,即保持隊內的下標對應的元素是降序。
當入隊成功時,判斷當前隊頭的下標是否等於i-w,如果等於,則已過期(畫個圖就明白了),把過期的元素彈出。
判斷完過期後,判斷是否形成了視窗,滿足則當前視窗最大值即為隊頭下標對應的元素。
publicstatic
int slide(int arr, int n, int
w)
return
res;
}
問題描述:
對於乙個沒有重複元素的整數陣列,請用其中元素構造一棵maxtree,maxtree定義為一棵二叉樹,其中的節點與陣列元素一一對應,同時對於maxtree的每棵子樹,它的根的元素值為子樹的最大值。
現有一建樹方法,對於陣列中的每個元素,其在樹中的父親為陣列中它左邊比它大的第乙個數和右邊比它大的第乙個數中更小的乙個。若兩邊都不存在比它大的數,那麼它就是樹根。請設計o(n)的演算法實現這個方法。
給定乙個無重複元素的陣列a和它的大小n,請返回乙個陣列,其中每個元素為原陣列中對應位置元素在樹中的父親節點的編號,若為根則值為-1。
測試樣例:[3,1,4,2],4
返回:[2,0,-1,2]
分析:此題重點是尋找每個元素左邊比其大的乙個數和右邊比其大的第乙個數。
方法:尋找右邊時,維護乙個棧,從右往左遍歷陣列
如果當前棧為空,則無比其大的數,並將次數入棧。
如果棧不為空,且棧頂元素比該數小時,出棧,直到可入。則棧頂為右邊比起大的第乙個數。若棧空,則無比其大的數。
publicint buildmaxtree(int arr, int
n)
if(stk.isempty()) right[i]=-1;
else right[i]=stk.peek();
stk.push(i);
}stk.clear();
for(int i=0;i)
if(stk.isempty()) ;
else
stk.push(i);
}return
right;
}
單調佇列,棧專題
a題 hdu 1506 題目大意 給你n個點,每乙個點代表當前座標下的矩形的高度,然後問你最大的矩形面積。具體思路 我們可以用乙個棧維護最大值,這個棧內的元素都是保持單調的,如果當前輸入的數比棧頂元素小的話,這個時候我們先算一波棧裡面的最大值,判斷停止的時候是當棧頂元素比當前輸入的元素小的時候停就可...
棧和佇列專題
本專題用於總結在刷題過程中用到的有關棧和佇列相關的知識點。api 棧 取棧頂元素是peek 而不是top 佇列 入佇列是add 或者 offer 而不是push 出佇列是poll 取隊頭也是peek 通常棧是不考慮排序的資料結構,要找棧中的最值,通常需要o n 的時間。要求你給出乙個o 1 時間求的...
演算法專題 棧和佇列
在j a中棧使用arraydeque和linkedlist,這兩個集合類既實現了list介面,也實現了deque介面。因此以上集合類可以當棧也可以當雙端佇列使用。1 使用兩個棧完成getmin功能,分別為data棧和min棧 壓入規則 將資料壓入data棧,判斷min棧是否為空 彈出規則 將data...