单调栈模板
通过一遍单调栈找出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] << " ";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App