日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一套模板通吃单调栈

發布時間:2025/3/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一套模板通吃单调栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單調棧

  • 下一個更大元素的位置(下標)
  • 下一個更小元素的位置(下標)
  • 前一個更大元素的位置(下標)
  • 前一個更小元素的位置(下標)
  • 總結

單調棧就是從數組中找到左右兩邊比你大的數或者比你小的數而且時間復雜度為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判斷里把等號去掉就好了。
  • 如果找后最大,前最小,即后一個比前一個大,那么維護的就是遞減的一個隊列,反之遞增。

總結

以上是生活随笔為你收集整理的一套模板通吃单调栈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。