题目链接:704. 二分查找
文档讲解:代码随想录
数要尽可能的大,高位开始尽量不变,从低位开始找到不满足递减的第一个位置,当前位置减1,后面的全都变成9即可。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int idx;
for (int i = strNum.size() - 1; i > 0; i--) {
if (strNum[i - 1] > strNum[i]) {
strNum[i] = '9';
strNum[i - 1]--;
}
}
return stoi(strNum);
}
};
题目链接:968.监控二叉树
文档讲解:代码随想录
很容易想到要从叶子结点的父节点开始每隔两个结点放一个摄像头为局部最优,但是怎样表示一个结点的状态(有摄像头,没有摄像头但被摄像头覆盖,没有摄像头也没有被摄像头覆盖)是个难点。
后序遍历递归返回值选择int
型,返回0
、1
、2
,其中0
表示没有摄像头也没有被摄像头覆盖,1
表示有摄像头,2
表示没有摄像头但被摄像头覆盖。
空结点处理:
分四种情况:
0
1
2
;class Solution {
public:
int minCameraCover(TreeNode *root) {
// 情况4
if (traversal(root) == 0)
// root无覆盖
result++;
return result;
}
private:
int result = 0;
int traversal(TreeNode *node) {
// 空结点,该结点有覆盖
if (node == NULL)
return 2;
int left = traversal(node->left);
int right = traversal(node->right);
// 情况1
// 左右结点都有覆盖,则该节点放置摄像头
if (left == 2 && right == 2)
return 0;
// 情况2
// 左右结点至少有一个没有覆盖
// left == 0 && right == 0 左右节点无覆盖
// left == 1 && right == 0 左节点有摄像头,右节点无覆盖
// left == 0 && right == 1 左节点有无覆盖,右节点摄像头
// left == 0 && right == 2 左节点无覆盖,右节点覆盖
// left == 2 && right == 0 左节点覆盖,右节点无覆盖
if (left == 0 || right == 0) {
result++;
return 1;
}
// 情况3
// left == 1 && right == 2 左节点有摄像头,右节点有覆盖
// left == 2 && right == 1 左节点有覆盖,右节点有摄像头
// left == 1 && right == 1 左右节点都有摄像头
// 其他情况前段代码均已覆盖
if (left == 1 || right == 1)
return 2;
return -1;
}
};