题目描述
现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。
给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为-1。保证数组中元素均为正整数。
测试样例:
[11,13,10,5,12,21,3],7
返回:[13,21,12,12,21,-1,-1]
思路:从后往前维护一个单调栈,注意细节(代码把主函数加上了)
#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
vector<int> findNext(vector<int> A, int n) {
// write code here
vector<int>v(n);
if(n==0) return v;
stack<int>s;
for(int i=n-1;i>=0;i--){
if(s.empty()){
s.push(A[i]);
v[i]=-1;
}
else if(s.top()>A[i]){
v[i]=s.top();
s.push(A[i]);
}
else{
bool ok=true;
while(!s.empty()){
if(s.top()>A[i]){
v[i]=s.top();
s.push(A[i]);
ok=false;
break;
}
s.pop();
}
if(ok){
s.push(A[i]);//记得要放进去
v[i]=-1;
}
}
}
return v;
}
int main(){
int n,x;
vector<int>v,ans;
freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&x);
v.push_back(x);
}
ans=findNext(v,n);
printf("n==%d\n",n);
for(int i=0;i<n;i++){
if(i&&i%10==0){
printf("\n");
}
printf(" %d",ans[i]);
}
printf("\n");
return 0;
}