一、LeetCode738. 单调递增的数字
题目链接:738. 单调递增的数字
这道题如果用暴力算法对小于等于目标数的每个整数进行一一判断的话就很花费时间很可能会超时。
所以我们把整数转化成字符串,然后依次从后往前对每个字符进行处理。
首先我们比较后面两个字符,如果靠后的字符ASC码值小于靠前的字符,说明这个数字非递增,这时需要靠前的字符减一,这时整数上高位就减一了,那么低位都需要变为最高数9这样才能保证数是最大值。
然后再依次向前判断是否递增。
代码如下:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);//将整数转化成字符串
for(int i = s.size() - 1; i > 0; i--) {
if(s[i] < s[i - 1]) {//如果后一位比前一位小,则前一位减一,后面的所有数就要变成最大值
for(int j = s.size() - 1; j >= i; j--) {
s[j] = '9';
}
s[i - 1] -= 1;
}
}
int result = 0;
for(int i = 0; i < s.size(); i++) {//将字符串转化成数字
result = result * 10 + (s[i] - '0');
}
return result;
}
};
二、LeetCode968. 监控二叉树
题目链接:968. 监控二叉树
我们规定每个节点有三种状态,分别是有摄像头、被摄像头覆盖和没被摄像头覆盖(分别用0、1和2表示)。
然后通过后序遍历从下往上去处理二叉树,根据子节点的状态来确定父节点的状态。
有三种情况:
1、如果子结点中有一个节点为0,也就是没被摄像头覆盖,我们就需要将父节点装上摄像头,这样才能覆盖那个子节点。
2、如果子结点中有一个节点为1,即该子节点有摄像头,此时父节点就被覆盖了。
3、如果左右子节点都被摄像头覆盖了我们就需要让父节点没被覆盖。
处理过程中如果遇到空节点,我们需要让它的状态变为2即被覆盖的状态,这样才不会影响父节点的处理。
处理到最后如果根本根节点,没被覆盖我们就需要让根节点装上摄像头。
代码如下:
class Solution {
private:
int result = 0;//记录摄像头的个数
public:
int travel(TreeNode* root) {
if(root == NULL) return 2;//如果遇到空节点设为覆盖状态
//后序遍历
int left = travel(root -> left);
int right = travel(root -> right);
if(left == 0 || right == 0) {//如果左右子节点至少有一个是没被覆盖的状态,则父节点需要装上一个摄像头
result++;
return 1;
} else if(left == 1 || right == 1) return 2;//如果子节点至少有一个摄像头则父节点是被覆盖的状态
else return 0;//其他情况父节点皆设为无覆盖状态
}
int minCameraCover(TreeNode* root) {
if(travel(root) == 0) result++;//如果处理到根节点时根节点为无覆盖状态,则需要在跟节点装上摄像头
return result;
}
};
总结
递增数字要转化成字符串来处理,监控二叉树要从下往上去处理,根据左右子节点的状态来决定父节点。