题目描述
思路
根据题目描述,每个位置的数要去找后面第一个大于等于它值的位置。可以维护一个单调递减栈,当一个值被弹出时就是该位置所在的答案,最后要记得把没出栈的位置标记-1,这些都是找不到答案的。由于每个元素只会出栈进栈各一次,所以复杂度 O ( n ) O(n) O(n)。
实现
#include <bits/stdc++.h>
using namespace std;
const int N=10;
int seq[N] = {6,1,4,3,6,2,4,7,3,5};
int brother[N];
stack<int> stk;
int main() {
while(!stk.empty()) stk.pop();
for(int i=0; i<N; i++) {
if(stk.empty()) stk.push(i);
else {
while(!stk.empty() && seq[stk.top()]<=seq[i]) {
brother[stk.top()] = i; //找到第一个大于等于它的下标
stk.pop();
}
stk.push(i);
}
}
while(!stk.empty()) { //剩余没有亲兄弟的点
brother[stk.top()] = -1;
stk.pop();
}
for(int i=0; i<N; i++) cout << brother[i] << ' '; cout << endl;
return 0;
}