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

本文介绍了一道热门笔试题,题意是通过消除连续递减序列部分,求解使数组变为单调递增所需的最少操作次数。解决思路是构建消除树,最大深度即为答案。文中提供了解题过程和相关代码实现。

 最近一道笔试题非常火热,大意即是经过多次操作,每次都消除连续递减部分,问经过多少次才能令数组变为递增的,即无法操作。

思路比较简洁:造出一颗消除树,每个节点的子节点就是最后会被这个节点消除的位置。最后的答案就是这棵树的最大深度。但是需要一些思维及编程技巧,第二次遇到这道题就决定把该题答案写出来了。代码如下

 

#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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值