單調棧的使用
單調棧的分類
單調遞增棧
單調遞減棧
所謂的遞增和遞減,相對的是:
棧頂 — 棧底的資料大小表示
棧頂 -> 棧底 從小到大 ,單調遞增
棧頂 -> 棧底 從大到小, 單調遞減
單調棧的實現方式(舉例用單調遞增棧)
從後向前進行儲存,並讀取。
如果棧空入棧
棧非空,此時棧頂元素 >= 入棧元素,入棧
棧非空,此時棧頂元素 < 入棧元素,則元素出棧,直到棧頂元素 >= 入棧元素,或者棧為空為止, 然**棧
實現**如下:
stack<
int> st;
int x;
cin >> x;
while
(!st.
empty()
&& st.
top(
)< x)
st.push
(x);
使用(用來求解單調性)
棧頂讀出來乙個元素,該元素滿足單調性的某一端。
例題:
#include
#include
#include
using namespace std;
int n,a[
3000005
],f[
3000005];
//a是需要判斷的陣列(即輸入的陣列),f是儲存答案的陣列
stack<
int>st;
//模擬用的棧
intmain()
if(st.
empty()
) f[i]=0
;else
f[i]
= st.
top();
st.push
(i);
}for
(int i =
1;i <= n;i++
) cout << endl;
return0;
}
部落格借鑑 單調棧的應用
問題描述 柱狀圖是有一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現在有n個由寬度為1,高度分別為h1,h2,hn的長方形從左到右依次排列組成的柱狀圖。問裡面包含的長方形的最大面積是多少?分析 最容易想到的方法是 討論左端l和右端r。如果確定了長方形的左端l和右端r,那麼最大的可能高度就是min...
單調棧的應用
筆者在做leecode的題 求柱形的最大面積 時,接觸到了單調棧這一資料結構,經過研究發現,單調棧是乙個比較簡單的資料結構,但是要靈活運用卻十分不簡單。單調遞增棧 資料出棧的序列為單調遞增序列 單調遞減棧 資料出棧的序列為單調遞減的序列 描述 有n個人站隊,所有的人全部向右看,個子高的可以看到個子低...
單調棧的應用
單調棧 故名思意,棧中元素是單調遞增 不減 或者是單調遞減 不增 leetcode 85 最大矩形 是乙個應用單調棧的好題目。題目分析 要找到乙個最大矩形,當然可以暴力解法,這個思路簡單,這裡就不多說了。該如何使用單調棧解決問題呢?可以先嘗試地做leetcode 84 柱狀圖中的最大矩形 這個是85...