数据结构【单调栈】
?詳細解讀
至此我們可以解答最開始的疑問,單調棧的根本作用在于求得「每一個數字在原始序列中左 / 右邊第一個大于 / 小于它自身的數字」,并且由于每一個數字只會入棧一次且最多出棧一次,因此總的時間復雜度為 O ( n ) 。
另外需要注意,一次「單調遞增棧」的過程,可以求得每個數字左邊第一個小于等于它的數,以及右邊第一個小于它的數,此處需注意「小于等于」和「小于」的區別。除此之外,「單調遞減棧」將上述的「小于」改為「大于」即可成立。
————————————————
下一個更大元素 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;} };總結
- 上一篇: 公会名字大全,高端点的公会名字465个
- 下一篇: 二分查找算法专题