一,先定义出存储数据的临时栈stk,来存储对应位的数值和位置;以及用来排序的单调栈,顾名思义单调栈内数据大小单调递增,栈底元素是最大的。还有输出栈,用来存储输出的ID;
二,(核心思路)关于单调栈,先依次从临时栈中依次往单调栈填入数据,若填入的数据比前一位小,保留数据和ID(位置),若比前一位大,则压碎(删除)前一位的数据,直到前一位数据比本身要大,并且前面被压碎的数据对应的输出位置是该较大数据的ID,重复此步骤,直到单调栈无新数据加入,留在单调栈中的数据所输出ID便为0;
三,关于定义,利用结构体来对栈的数据和ID进行储存;
四,值得注意的是,在while中赋值的时候,先把out数组填入答案,再top--,直接快速删除单调栈前一位较小值,并且out的索引是单调栈的对应位的id,等于的是该循环中i的值,既第几位;
以下是ac代码
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int val;
int id;
} stack;
stack str[100005];
stack tem;
int h[100005];
int out[100005];
int top=-1;
void push(stack tem)
{
str[++top]=tem;
}
void pop()
{
str[top--];
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&h[i]);
}
for(int i = 1; i <= n; ++i)
{
tem.val=h[i],tem.id=i;
while(top>=0&&str[top].val<tem.val)
{
out[str[top].id]=i;
pop();
}
push(tem);
}
for(int i = 1; i <= n; ++i)
{
printf("%d\n",out[i]);
}
}