题解 | #单调栈结构(进阶)#

单调栈结构(进阶)

https://www.nowcoder.com/practice/2a2c00e7a88a498693568cef63a4b7bb

//单调栈结构(进阶)
//https://www.nowcoder.com/practice/2a2c00e7a88a498693568cef63a4b7bb

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6+10;

int arr[N];
int stk[N];
int ans[N][2];
int top=0;//栈顶
int n=0;//arr元素个数
int pop=0;//当前弹出的位置

void compute()
{
//一、入栈阶段:
    //遍历:严格大压小,将不合适的元素弹出占中,此时弹出的元素的左右答案已经找到,只剩下弹栈完后的栈中元素的左右答案还未找到
    for(int i=0 ; i<n ; i++)
    {
        //一阶弹栈:入栈时遇到小于或等于栈中元素时弹栈
        //弹栈可以结算答案
        while( (top > 0) && (arr[i] <= arr[stk[top-1]]) )
        {
            //将要弹栈的下标:pop
            pop = stk[--top];//当前要被弹出的元素下标
            //ans[pop][0]:结算左边 | ans[pop][1]:结算右边
            ans[pop][0] = top > 0 ? stk[top-1] : -1; //判断当前元素地下还有没有数
            ans[pop][1] = i;
        }
        //将大于等于当前元素的元素全部弹栈之后 , 将当前元素入栈
        stk[top++] = i;
    }

//二、弹栈阶段(二阶弹栈) 
    //清算阶段:将栈中的元素找到左右答案
    //将栈中的下标一次弹出
    while(top > 0) // top > 0 栈里有元素
    {
        pop = stk[--top];
        ans[pop][0] = top > 0 ? stk[top-1] : -1;
        ans[pop][1] = -1;
    }

//三、修正阶段:从右往左遍历 
    //针对右答案 如果右答案的值与当前元素的值相同时,将右答案的右答案作为自己的右答案
    for(int i=n-2 ; i>=0 ; i--)
    {
        if( (ans[i][1] != -1) && (arr[ans[i][1]] == arr[i]) )
        {
            ans[i][1] = ans[ans[i][1]][1];
        }
    }
}

int main()
{
    scanf("%d" , &n);
    for(int i=0 ; i<n ; i++)
    {
        scanf("%d" , &arr[i]);
    }

    compute();

    for(int i=0 ; i<n ; i++)
    {
        printf("%d %d\n" , ans[i][0] , ans[i][1]);
    }

    return 0;
}

全部评论

相关推荐

书海为家:实习是成为大厂正式员工很好的敲门砖,看您的简历中有一段实习经历,挺好的。我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己实习时做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4249次浏览 75人参与
# AI面会问哪些问题? #
27474次浏览 550人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15055次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20026次浏览 342人参与
# 找AI工作可以去哪些公司? #
8924次浏览 230人参与
# 春招至今,你的战绩如何? #
64347次浏览 575人参与
# 厦门银行科技岗值不值得投 #
7922次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
8776次浏览 299人参与
# 你做过最难的笔试是哪家公司 #
33017次浏览 229人参与
# 中国电信笔试 #
31886次浏览 292人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340689次浏览 2173人参与
# 哪些公司真双非友好? #
69551次浏览 289人参与
# 阿里笔试 #
178341次浏览 1314人参与
# 机械人避雷的岗位/公司 #
62673次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14380次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22046次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26220次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9741次浏览 193人参与
# HR最不可信的一句话是__ #
6145次浏览 113人参与
# 应届生第一份工资要多少合适 #
20663次浏览 86人参与
# AI时代,哪个岗位还有“活路” #
11407次浏览 339人参与
# 春招你拿到offer了吗 #
831056次浏览 9986人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务