NC157 单调栈

单调栈

https://www.nowcoder.com/practice/ae25fb47d34144a08a0f8ff67e8e7fb5?tpId=196&tqId=37572&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=581&title=

class Solution {
public:
    vector<vector<int> > foundMonotoneStack(vector<int>& nums) {
        int len=nums.size();
        //调用vector的无参构造函数创建一个长度为len,宽为1的二维容器
        vector<vector<int>> ans(len);
        //遍历二维容器的每一行,调用resize函数将容器的每一行的列宽都扩大为2
        for(int i=0;i<len;i++) ans[i].resize(2);
        //写两个单调栈
        stack<int> stack1;
        //正向遍历,如果栈非空,并且栈顶元素比要入栈的元素大,则让栈顶的元素出栈
        //判断一下,如果栈为空,则表示该元素的左边没有比本元素小的元素,输出-1
        //否则输出向左遍历找到的第一个比当前的元素小的元素(单调栈)
        //将当前的元素入栈
        for(int i=0;i<len;i++){
            while(!stack1.empty()&&nums[stack1.top()]>=nums[i]){
                stack1.pop();
            }
            if(stack1.empty()) ans[i][0]=-1;
            else  ans[i][0]=stack1.top();
            stack1.push(i);
        }
        //将刚刚构造的单调栈清空
        //逆向遍历重新构造一个单调栈,用于查找当前元素右边第一个比当前元素小的元素
        while(!stack1.empty()) stack1.pop();
        for(int i=len-1;i>=0;i--){
            while(!stack1.empty()&&nums[stack1.top()]>=nums[i]){
                stack1.pop();
            }
            if(stack1.empty()) ans[i][1]=-1;
            else ans[i][1]=stack1.top();
            stack1.push(i);
        }
        return ans;
    }
   
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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