最右边第一个比当前大的NUS 2586单调栈

给出一组数据,求出各个位置第一个比自己大的位置,0代表没有。
1 2 3 1 1 1 1 4 5
2 3 8 8 8 8 8 9 0
我们暴力办法就是一个一个比较,时间复杂度n*n。
如果中间插了1亿个1,则是个天文数字,所以需要使用单调栈。
思想:
如果空栈或者当前位置值小于等于栈顶值,则入栈该位置。
否则,一直更新位置并出栈
descript:
有n座山,他们连在一起成一条直线,接着从左往右给出每座山的高度a[i],现在的问题是让你求的每座山右边的第一个比它高的山是第几座山呢?如果没有则输出0。
测试数据有多组。对于每组测试数据:
输入一个n表示有n座山(1 <= n <= 1000000)
接着输入n个数a[i] ( 1 <= a[i] <= 1000000),表示第i座山的高度。

for (遍历这个数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素)
{
入栈;
}
else
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
}

#include 
#include 
#include 
#include 
#include 
#define ll long long
#define ull unsigned long long
using namespace std;
const int N=1e6+6;
int a[N];

int main(){
    int t;
    stack<int>q;
    while(scanf("%d",&t)!=EOF){
        for(int i=1;i<=t;i++){
            scanf("%d",&a[i]);
            if(q.empty()||a[i]<=a[q.top()])
                q.push(i);
            else {
            while(!q.empty()&&a[i]>a[q.top()])
            {
                a[q.top()] = i;
                q.pop();
            }
              q.push(i);
            }
          }
        while(!q.empty()){
            a[q.top()] = 0;
            q.pop();
        }
        for(int i=1;i<=t;i++)
            printf("%d ",a[i]);
        printf("\n");
    }

    return 0;
}

你可能感兴趣的:(单调栈)