738.单调递增的数字
738题目链接
最为关键一点:以两位数为例:如果 n[i - 1] > n[i], 那么将 n[i - 1] - -,然后n[i]变为9, 从右往左遍历,两位两位的比较。
但是会有1000 这种情况,按照上面方法会变成900,显然不是最大的,所以调整上述方法,记录变为9的最大i 位置,然后将其后面的值全部变成9.
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int flag = s.size();
for (int i = s.size() - 1; i > 0; i--) {
if (s[i] < s[i - 1]) {
flag = i;
s[i - 1]--;
}
}
for (int i = flag; i < s.size(); i++) {
s[i] = '9';
}
return stoi(s);
}
};
968.监控二叉树
968题目链接
因为摄像头可以覆盖上中下三层,所以要优先把摄像头放在叶子节点的父节点的位置,才能充分利用摄像头的覆盖面积。要从叶子节点从下往上看,因为头结点放或者不放,也就省一个摄像头,但是叶子节点省下的摄影头是 2的n次方 - 1
二叉树的遍历顺序,从下往上 后序遍历(左右中),只有左右节点的状态确定了,才可以确定父节点的状态。
叶子节点的父节点优先放摄像头,然后向上遍历的过程中,然后每隔两个节点放一个摄像头,
每个节点的状态有三种:
0 无覆盖
1 有摄像头
2 有覆盖
无摄像头的状态其实就分为 0、2,要么有覆盖,要么无覆盖
在回溯遍历到空节点的时候,空节点的状态只能赋值为 有覆盖,其他两种状态 均无法使得 叶子节点的父节点放摄像头
状态转移:
1、当左右孩子都为 有覆盖2 时,父节点为无覆盖0,等着父节点的父节点安装摄影头将其覆盖
2、当左右孩子至少有一个是无覆盖0, 那么父节点一定要装一个摄像头1
3、当左右孩子至少有一个有摄影头时,那么父节点一定是有覆盖1
4、以上三种情况涵盖了左右孩子的所有的情况,但是还有一种特殊情况,当根节点是无覆盖0时,需要加一个摄影头
class Solution {
public:
int cout = 0;
int minCameraCover(TreeNode* root) {
if (traversal(root) == 0) {
cout++;
}
return cout;
}
int traversal(TreeNode* node) {
if (node == NULL) return 2;
int left = traversal(node->left);
int right = traversal(node->right);
if (left == 2 && right == 2) {
return 0;
} else if (left == 0 || right == 0) {
cout++;
return 1;
} else if (left == 1 || right == 1) {
return 2;
}
return -1;
}
};