单调栈模板
通过一遍单调栈找出i下标数字左右两边第一个比它大的数字
在将数放入栈的时候,将她与栈顶比较,因为栈是先进后出,所以当栈顶的数比她小的时候,就压出栈顶,并且对于栈顶来说,这个数就是她左边第一个比它大的数,当这个数遇到比它大的数时,这个比它大的数就是它右边第一个大于它的数,最后再将栈中遗留的数重复上面判断即可
点击查看代码
stack<int> st;
int ansl[N]; // 左边的
int ansr[N]; // 右边的
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = n; i >= 1; i--) // 我是从右往左找
{
while (!st.empty() && a[i] >= a[st.top()]) // 当当前的栈不为空,并且当前下标的数值一直大于栈顶的数值,就弹出栈顶
{
int p = st.top(); // 记录栈顶
st.pop();
ansl[p] = i; // 对于每个被弹出的栈顶,将它弹出的这个值就是它左边的第一个比它大的数
if (st.size()) // 栈顶被弹出后如果还有值,那对于弹出的栈顶来说,被弹出后的栈的栈顶就是它右边的第一个比它大的数
ansr[p] = st.top();
}
if (st.empty()) // 如果栈为空,说明当前这个数比之前压进去的所有数都要大,她右边没有比他大的数
{
ansr[i] = 0;
}
else
{
ansr[i] = st.top(); // 不然,当前栈顶就是她右边第一个比她大的数
}
st.push(i); // 压入栈
}
while (st.size()) // ,说明栈中还有值,需要弹出,弹出的数的左边没有比它大的数
{
int p = st.top();
st.pop();
if (st.size())//对于每个被弹出的数,如果栈中还有数字,那栈顶的数就是她后边第一个比她大的数
ansr[p] = st.top();
}
for (int i = 1; i <= n; i++)
{
cout << ansr[i] << " ";
}
浙公网安备 33010602011771号