LeetCode 738.单调递增的数字
题目链接:738. 单调递增的数字 - 力扣(LeetCode)
思路:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strnum = to_string(n);
//flag用来标记赋值9从哪里开始
//设置这个默认值,为了防止第二个for循环在flag没有赋值的情况下执行
int flag = strnum.size();
for(int i = strnum.size() - 1; i > 0; i--) {
if(strnum[i - 1] > strnum[i]) {
flag = i;
strnum[i - 1]--;
}
}
for(int i = flag; i < strnum.size(); i++) {
strnum[i] = '9';
}
return stoi(strnum);
}
};
LeetCode968.监督二叉树
题目链接:968. 监控二叉树 - 力扣(LeetCode)
思路:
局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int result;
int travelsal(TreeNode* cur) {
//空节点,该节点有覆盖
if(cur == NULL) return 2;
int left = travelsal(cur->left);//左
int right = travelsal(cur->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;
}
int minCameraCover(TreeNode* root) {
result = 0;
if(travelsal(root) == 0) {//情况4.root无覆盖
result++;
}
return result;
}
};