2.1 寻找左侧第一个比当前元素大的元素
单调递减
当入栈元素大于栈顶元素,弹出
栈非空:栈顶元素即为所得
栈空:根据题目要求是0/-1
2.2 寻找左侧第一个比当前元素小的元素
单调递增
当入栈元素小于栈顶元素,弹出
栈非空:栈顶元素即为所得
栈空:根据题目要求的是0/-1
2.3 寻找右侧第一个比当前元素大的元素
(从左向右看递增,从右向左看递减,即2.1)
逆序遍历
2.4 寻找右侧第一个比当前元素小的元素
(从左向右看递减,从右向左看递增,即2.2)
逆序遍历
tips:看题目如果是要求编号,则i入栈;若求元素,则a[i]入栈
//寻找左侧第一个比当前元素大的元素
//单调递减:当前元素大于栈顶元素则出栈 2.插入时的栈顶元素
//#include[HTML_REMOVED]
//using namespace std;
//const int N=1e5+10;
//int a[N];
//int main(){
//int n;
//cin>>n;
//stack[HTML_REMOVED] stk;
//for(int i=0;i[HTML_REMOVED]>a[i];
//for(int i=0;i[HTML_REMOVED]=stk.top()){
// stk.pop();
// }
// if(!stk.empty()){
// cout<<stk.top()<<” “;
// }else{
// cout<<-1<<” “;
// }
// stk.push(a[i]);
//} }
//寻找左侧第一个比当前元素小的元素
//单调递增:当栈顶元素大于入栈元素则出栈
//#include[HTML_REMOVED]
//using namespace std;
//const int N=1e5+10;
//int a[N];
//int main(){
//int n;
//cin>>n;
//stack[HTML_REMOVED] stk;
//for(int i=0;i[HTML_REMOVED]>a[i];
// while(!stk.empty()&&a[i]<=stk.top()){
// stk.pop();
// }
// if(!stk.empty()){
// cout<<stk.top()<<” “;
// }else{
// cout<<-1<<” “;
// }
// stk.push(a[i]);
//} }
//寻找右侧第一个比当前元素大的元素
//#include[HTML_REMOVED]
//using namespace std;
//const int N=1e5+10;
//int a[N],l[N];
//int main(){
//int n;
//cin>>n;
//stack[HTML_REMOVED] stk;
//for(int i=1;i<=n;i) cin>>a[i];
//for(int i=n;i>=1;i–){ //逆序遍历
// while(!stk.empty()&&a[i]>=stk.top()){
// stk.pop();
// }
// if(!stk.empty()){
// l[i]=a[stk.top()];
// }else{
// l[i]=0;
// }
// stk.push(a[i]);
//}
//for(int i=1;i<=n;i) cout<<l[i]<<endl;
//}
//寻找右侧第一个比当前元素小的元素
//#include[HTML_REMOVED]
//using namespace std;
//const int N=1e5+10;
//int a[N],l[N];
//int main(){
//int n;
//cin>>n;
//stack[HTML_REMOVED] stk;
//for(int i=1;i<=n;i){ cin>>a[i];}
// for(int i=n;i>=1;i–){
// while(!stk.empty()&&a[i]<=stk.top()){
// stk.pop();
// }
// if(!stk.empty()){
// l[i]=stk.top();
// }else{
// l[i]=-1;
// }
// stk.push(a[i]);
//}
//for(int i=1;i<=n;i){
// cout<<l[i];
//}
// }