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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构【单调栈】

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构【单调栈】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?詳細解讀

至此我們可以解答最開始的疑問,單調棧的根本作用在于求得「每一個數字在原始序列中左 / 右邊第一個大于 / 小于它自身的數字」,并且由于每一個數字只會入棧一次且最多出棧一次,因此總的時間復雜度為 O ( n ) 。

另外需要注意,一次「單調遞增棧」的過程,可以求得每個數字左邊第一個小于等于它的數,以及右邊第一個小于它的數,此處需注意「小于等于」和「小于」的區別。除此之外,「單調遞減棧」將上述的「小于」改為「大于」即可成立。
————————————————

int tt = 0; for (int i = 1; i <= n; i ++ ) {while (tt && check(q[tt], i)) tt -- ;stk[ ++ tt] = i; }

下一個更大元素 I

class Solution { public: vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {//首先構建一個單調棧 stack<int>stk;//使用vector來紀錄當前對應各個元素下一個更大值的情況vector<int>q(nums2.size());//根據題意需要尋找右側第一個目標值,所以從vector最后一個元素處理for (int i = nums2.size() - 1; i >= 0; i--) {int x = nums2[i];//根據題意,可設置為單調遞減棧,即從棧底到棧頂為降序while (stk.size() && x >= stk.top()) stk.pop();//如果單調棧為空說明不存在符合條件的元素,返回-1if (stk.empty()) q[i] = -1;//當前棧頂元素為右側第一個比當前x大的元素,并且記錄在當前下標對應位置else q[i] = stk.top();//將當前元素入棧stk.push(x);}unordered_map<int, int> hash;for (int i = 0; i < nums2.size(); i++)hash[nums2[i]] = i;vector<int> res;for (auto x : nums1)res.push_back(q[hash[x]]);return res;} };

總結

以上是生活随笔為你收集整理的数据结构【单调栈】的全部內容,希望文章能夠幫你解決所遇到的問題。

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