循環數組單調棧


  • 一個點前後的點都可以是它的解,同一個點相等肯定不會入棧。
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<pair<int,int>>stack;
        vector<int>res;
        for(int i=nums.size()-1;i>=0;i--){
            stack.push_back(make_pair(nums[i],i));
        }
        for(int i=nums.size()-1;i>=0;i--){
            // i [0,len-1] 
            while(!stack.empty()&&stack.back().first<=nums[i]){
                stack.pop_back();
            }
        
            // 可能出現遍歷完後面倍增數組的情況
            if(stack.empty()){
                res.push_back(-1);
            }
            else{
                res.push_back(stack.back().first);
            }
            stack.push_back(make_pair(nums[i],i));
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

或者簡化一下:直接暴力空的stack從後往前遍歷,res取i%n,相當於先考慮一輪後序遍歷,再進行一輪後序遍歷,相當於第一輪是考慮後邊的更大值,第二輪是解決後面沒有更大值的情況下考慮前面的情況。如果前面後面都有更大值也不怕,因爲第二輪遍歷會用後面的最大值覆蓋掉前面的最大值的解。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n);
        stack<int> s;
        // 假裝這個數組長度翻倍了
        for (int i = 2 * n - 1; i >= 0; i--) {
            // 索引要求模,其他的和模板一樣
            while (!s.empty() && s.top() <= nums[i % n])
                s.pop();
            res[i % n] = s.empty() ? -1 : s.top();
            s.push(nums[i % n]);
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章