版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yellow_paper/article/details/82503067
最近一道笔试题非常火热,大意即是经过多次操作,每次都消除连续递减部分,问经过多少次才能令数组变为递增的,即无法操作。
思路比较简洁:造出一颗消除树,每个节点的子节点就是最后会被这个节点消除的位置。最后的答案就是这棵树的最大深度。但是需要一些思维及编程技巧,第二次遇到这道题就决定把该题答案写出来了。代码如下
#include <iostream>
using namespace std;
const int N = 100000;
int max(int a, int b) {
return a > b ? a : b;
}
int index;
int layer[N];
int layerIndex[N];
int par[N];
int val[N];
int num;
int main() {
for (int i = 0; i < N; ++i) {
par[N] = -1;
}
cin >> num;
for (int i = 0; i < num; ++i) {
cin >> val[i];
}
int last;
par[0] = 0;
last = val[0];
index = 0;
layer[index] = val[0];
layerIndex[index] = 0;
for (int i = 1; i < num; ++i) {
if (val[i] < last) {
par[i] = layerIndex[index];
}
else {
while (index>=0 && layer[index] < val[i]) {
--index;
}
++index;
layer[index] = val[i];
layerIndex[index] = i;
par[i] = index==0 ? i : layerIndex[index-1];
}
last = val[i];
}
for (int i = 0; i < num; ++i) {
layer[i] = 0;
}
for (int i = num - 1; i >= 0; --i) {
if (par[i] == i) {
continue;
}
layer[par[i]] = max(layer[par[i]], layer[i] + 1);
}
int res = 0;
for (int i = 0; i < num; ++i) {
res = max(res, layer[i]);
}
cout << res;
return 0;
}
/*
10
3 5 1 3 0 9 3 2 7 4
*/