热点笔试题:经过多少次消除才能将序列变为单调递增/递减序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
*/

猜你喜欢

转载自blog.csdn.net/yellow_paper/article/details/82503067
今日推荐