题解 | 单调栈

单调栈

https://www.nowcoder.com/practice/ae25fb47d34144a08a0f8ff67e8e7fb5

class Solution {
public:
    vector<vector<int> > foundMonotoneStack(vector<int>& nums) { 
    //单调栈:单增栈,新数来,把栈中大于它的所有数弹出,既是找最近小于它的数(),也是维护了栈的单增顺序。
    //栈保持最近最大,也就是栈中(旧数)比新数大的数舍去,因为永远取不到了,如果后数大于前一个数,就取前一个数,后数如果小于前一个数,就取比前一个数更小的数,永远取不到比前一个数大的数,所以相对于暴力算法,减去了这一部分的检索,且有按照大小顺序检索;
    //这种递增:截止递增:栈中递增,但不大于新加入的数
        int n = nums.size();
        vector<vector<int>> ans(n, vector<int>(2));

        stack<int> stk;
        for(int i=0; i<n; i++){
            while(!stk.empty() && nums[stk.top()] >= nums[i]){
                stk.pop();
            }
            if(stk.empty())ans[i][0] = -1;
            else{
                ans[i][0] = stk.top();
            }
            stk.push(i);
        }

        while(!stk.empty())stk.pop();
        for(int i=n-1; i>=0; i--){
            while(!stk.empty() && nums[stk.top()] >= nums[i]){
                stk.pop();
            }
            if(stk.empty())ans[i][1] = -1;
            else{
                ans[i][1] = stk.top();
            }
            stk.push(i);
        }

        return ans;
    }
};

全部评论

相关推荐

06-27 15:15
长安大学 Java
点赞 评论 收藏
分享
程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务