#include<iostream>
using namespace std;
#include<vector>
#include<stack>
int main()
{
stack<int>v;
vector<int>u;
int n;
cin >> n;
if (n == 1)
{
cout << -1 << " ";
return 0;
}
cout << -1 << " ";
//while (n--)
//{
// int num2;
// cin >> num2;
// u.push_back(num2);
//} 这个地方前往不要再这么写了已经好几回了
for (int i = 0; i < n; i++)
{
int num2;
cin >> num2;
u.push_back(num2);
}
for (int i = 1; i < n; i++)
{
int j = i;
while (j!=0)//这么写陷入死循环原因就在于这个当i++之后又开始进行减减
{
v.push(u[j - 1]);
//cout<<v.top()<<endl;
if (v.top() >= u[i] && j == 1) //切记真正比较的是i不是j j只是用于向栈中传入元素
{
cout << -1 << " ";
break;
}
if (v.top() >= u[i])
{
v.pop();
}
else if(v.top()< u[i])
{
cout << v.top() << " ";
break;
}
j--;//这个就是一个很重要要的因素 陷入死循环
}
v = stack<int>();
}
}
这个代码我个人认为没啥问题 但是时间超限 若发现问题请提出 谢谢
其实仔细想想这两个代码主要还在于第一个 是我个人写的
我当时写那个代码主要想的就是直接一一进行比较 说实话 内层循环的时间复杂的大
在后来我写的那个 其实说实话 看着像挺好 其实仔细想一想 写的那不就是暴力算法吗
再看下一个代码
虽然说 他看着也挺像暴力算法 但是仔细想一想
他说好的用单调栈 但是实际上用的是数组
而且 你看他这个也可以联想到双指针 再加上 你在看他能找到的是单调的所以最后的时候他这个时间复杂度肯定小
#include<iostream>
using namespace std;
const int n = 100010;
int arr[n], t;//这个代码也可以理解为用数组模拟栈
int main()
{
int m;
cin >> m;
while (m--)
{
int x;
cin >> x;
while (t && arr[t] >= x)t--;//仔细想想这个地方 是否一定必须放在前面
//仔细想一下 这个相当于就是能找到一个单调的栈 然后利用这个性质 不信你试一试2 4 3 5 6
//我个人认为很特别的地方就在于这个相当于是arr这个数组的首元素的下标是从1开始的
//所以说这个地方是找一个单调的栈!!!!
//在准备好单调的栈后来进行以下应用
if (t&&arr[t] < x)
{
cout << arr[t] << " ";
}
else
{
cout << -1 << " ";
}
arr[++t] = x;
}
}