#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
class MaxTree {
public:
vector<int> buildMaxTree(vector<int> A, int n) {
const int NONE = -1;
vector<int> left; //下标
vector<int> right;//下标
stack<int> myStack;//下标
int Size = A.size();
myStack.push(0);
left.push_back(NONE);
for(int i = 1; i < Size; i++) {
int topValue = A[myStack.top()];
while(!myStack.empty() && A[i] > topValue) {
myStack.pop();
if(myStack.empty()) break;//省略数组越界异常!
topValue = A[myStack.top()];
}
if(myStack.empty()) {
left.push_back(NONE);
myStack.push(i);
} else {
left.push_back(myStack.top());
myStack.push(i);
}
}
while(!myStack.empty()) {
myStack.pop();
}
myStack.push(Size-1);
right.push_back(NONE);
for(int i = Size-2; i >= 0; i--) {
int topValue = A[myStack.top()];
while(!myStack.empty() && A[i] > topValue) {
myStack.pop();
if(myStack.empty()) break;
topValue = A[myStack.top()];
}
if(myStack.empty()) {
right.push_back(NONE);
myStack.push(i);
} else {
right.push_back(myStack.top());
myStack.push(i);
}
}
reverse(right.begin(), right.end());
vector<int> result;
for(int i = 0; i < Size; i++) {
if(left[i] == NONE && right[i] == NONE) {
result.push_back(-1);
} else if((left[i] == NONE && right[i] != NONE) || (left[i] != NONE && right[i] == NONE) ) {
if(left[i] != NONE) result.push_back(left[i]);
else result.push_back(right[i]);
} else {
if(A[left[i]] > A[right[i]]) result.push_back(right[i]);
else result.push_back(left[i]);
}
}
return result;
}
};
int main()
{
vector<int> A;
int n;
int input;
while(scanf("%d", &n) != EOF) {
A.clear();
for(int i = 0; i < n; i++) {
scanf("%d", &input);
A.push_back(input);
}
MaxTree *obj = new MaxTree();
vector<int> result = obj->buildMaxTree(A, n);
cout << "result: ";
for(int i = 0; i < (int)result.size(); i++) {
printf("%d ", result[i]);
}
}
return 0;
}
/***
10
8 1 9 3 2 6 0 5 4 7
***/
【牛客网】构造MaxTree
最新推荐文章于 2021-02-26 15:42:18 发布