单调栈模板

通过一遍单调栈找出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] << " ";
	}
posted @   台州第一深情  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示