代码随想录第三十七天|738.单调递增的数字、968.监控二叉树

738.单调递增的数字

题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

//738.单调递增的数字
int monotoneIncreasingDigits(int n) {
	//将数字转换成字符串,容易进行处理
	string sResult = to_string(n);
	//nFlag作为标记,标记从什么位置后将数字转为9
	int nFlag = sResult.size();
	for (int i = sResult.size() - 1; i > 0; i--) {
		if (sResult[i - 1] > sResult[i]) {
			sResult[i - 1]--;
			//做标记
			nFlag = i;
		}
	}
	//将标记的位置后的部分转为‘9’
	for (int i = nFlag; i < sResult.size(); i++) {
		sResult[i] = '9';
	}
	return stoi(sResult);
}

 2.本题小节

        思考:本题的核心是理解一点,就是只要是满足了前一个数大于当前数的话,那么当前数及其后面的数所有的数都要变成9,而前一个数要减一,因此需要找到这个最靠前的下标,将这个下标对应的数及其后面的数全部变为9,前面一个数减一即可。

        基本步骤:为了容易处理数字,使用函数to_string将数字变为字符串处理,对字符串从后往前遍历,通过比较当前数和前一个数之间的关系,如果是大于,那么久更新前一个数和下标,这里之所以从后往前遍历,就是为了将前一个数的结果用到前前一个数上;遍历下标及其之后的数,将下标及其之后的数更新即可,最后将字符串转换为整数即可。

968.监控二叉树

 题目链接/文章讲解/视频讲解:

1.代码展现

int g_nResult = 0;
int travelsal(TreeNode* curNode) {
	//step1 确定参数
	//step1 确定终止条件
	if (curNode == nullptr) {
		//叶子节点下为被覆盖的状态
		return 2;
	}
	//step3 单层遍历逻辑
	//后序遍历法
	//左
	int nLeft = travelsal(curNode->left);
	//右
	int nRight = travelsal(curNode->right);
	//中
	//子节点都为覆盖的状态
	if (nLeft == 2 && nRight == 2) {
		//当前节点则为未覆盖状态
		return 0;
	}
	//至少一个节点为未覆盖状态(这个得放在下一个情况前)
	if (nLeft == 0 || nRight == 0) {
		//当前节点未摄像头
		g_nResult++;
		return 1;
	}
	//至少一个子节点为摄像头
	if (nLeft == 1 || nRight == 1) {
		//当前节点则为覆盖状态
		return 2;
	}
	return -1;
}
int minCameraCover(TreeNode* root) {
	int nRootState = travelsal(root);
	//当根节点是未覆盖状态时
	if (nRootState == 0) {
		g_nResult++;
	}
	return g_nResult;
}

 2.本题小节

        思考:本题首先要明每个节点有三种情况,有覆盖,无覆盖,摄像头这三种情况,分别记为2,0,1,然后要明确遍历时的三种情况:左右子节点均为有覆盖的情况,那么当前节点为无覆盖情况,返回0;左右节点至少有一个为未覆盖的情况,则当前节点有摄像头,返回1;左右节点至少有一个有摄像头的情况,则当前节点为覆盖,返回2,注意第二第三种情况不能换顺序,否则第三种情况中的1,0会导致摄像头数不够。空节点经过分析后为覆盖的情况。根节点可能为未覆盖的情况,因此需要检测,如果为未覆盖的情况,那么就增加一个摄像头。

        基本思路:本题使用后序遍历,通过左右子节点的返回值来判断当前节点的状态并返回给上一个节点,剩下的思路如思考所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值