一套模板通吃单调栈
單調棧
- 下一個更大元素的位置(下標)
- 下一個更小元素的位置(下標)
- 前一個更大元素的位置(下標)
- 前一個更小元素的位置(下標)
- 總結
單調棧就是從數組中找到左右兩邊比你大的數或者比你小的數而且時間復雜度為O(N)
單調棧與單調隊列的唯一區別就是單調棧沒有頭刪操作(過期)
單調棧與單調隊列性質類似通俗的說就是具有單調性的棧,其中單調性可以單調遞增也可以單調遞減,并且,隊尾可以進行出隊操作,隊尾可以進行入隊操作。
單調遞增棧就是從棧底到棧頂是從小到大
單調遞減棧就是從棧底到棧頂是從大到小
單調隊列:擅長維護區間最大/最小值,最小值對應著遞增隊列,最大值對應著遞減隊列
單調棧::擅長維護最近大于/小于關系,從左側先入棧就是維護左側最近關系,從右側先入棧就是維護右側最近關系
下一個更大元素的位置(下標)
int ans[n+10]; stack<int>s;for (int i = n; i >= 1; --i){while (!s.empty() && a[s.top()] <= a[i])s.pop();ans[i] = s.empty() ? 0 : s.top();s.push(i);}下一個更小元素的位置(下標)
int ans[n+10]; stack<int>s;for (int i = n; i >= 1; --i){while (!s.empty() && a[s.top()] >= a[i])s.pop();ans[i] = s.empty() ? 0 : s.top();s.push(i);}前一個更大元素的位置(下標)
int ans[n+10]; stack<int>s;for (int i = 1; i <= n; ++i){while (!s.empty() && a[s.top()] <= a[i])s.pop();ans[i] = s.empty() ? 0 : s.top();s.push(i);}前一個更小元素的位置(下標)
int ans[n+10]; stack<int>s;for (int i = 1; i <= n; ++i){while (!s.empty() && a[s.top()] >= a[i])s.pop();ans[i] = s.empty() ? 0 : s.top();s.push(i);}總結
- 后一個就從后往前遍歷,前一個就從前往后遍歷
- 下一個更大,就要確保棧頂的元素大于當前元素,否則彈出
- 下一個更小,就要確保棧頂的元素小于當前元素,否則彈出
- 如果是小于等于啥辦?,其實只要被while判斷里把等號去掉就好了。
- 如果找后最大,前最小,即后一個比前一個大,那么維護的就是遞減的一個隊列,反之遞增。
總結
- 上一篇: python前端学习-----Flask
- 下一篇: 单调队列(一套模板通吃)