题目1:738 单调递增的数字
题目链接:738 单调递增的数字
题意
每个相邻位的数字的前一位小于等于后一位,则该整数是单调递增的
返回小于或等于n的最大数字且单调递增
代码
class Solution {
public:
int monotoneIncreasingDigits(int n) {
//转化为字符串
string str = to_string(n);
int flag = str.size();
//从后向前遍历
for(int i=str.size()-1;i>0;i--){
//非递增
if(str[i]<str[i-1]){
str[i-1]--;
flag = i;
}
}
for(int i=flag;i<str.size();i++) str[i] = '9';
return stoi(str);//转化为整数
}
};
- 时间复杂度:O(n),n 为数字长度
- 空间复杂度:O(n),需要一个字符串,转化为字符串操作更方便
题目2:968 监控二叉树
题目链接:968 监控二叉树
题意
在二叉树的节点上安装摄像头,节点的摄像头可以监视其父节点,自身已经左右孩子
如果监控所有节点,最少需要多少个摄像头
注意
1)添加节点在叶子节点的父节点添加,这样可以使用少量的摄像头,每隔两个节点添加摄像头
2)遍历顺序 后序遍历
3)3种状态的转移 无覆盖状态0 有摄像头状态1 有覆盖状态2
4)空节点是有覆盖状态
5)根节点是无覆盖状态时 要添加一个摄像头
代码
/**
* 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 = 0;
int traversal(TreeNode* cur){
//终止条件 空节点是有覆盖状态2
if(cur==NULL) return 2;
//单层递归逻辑
//后序遍历 左右中
//左
int left = traversal(cur->left);
//右
int right = traversal(cur->right);
//中
//情况1 左右孩子均为有覆盖状态2 父节点需为无覆盖状态0
if(left==2 && right==2) return 0;
//情况2 左右孩子至少一个无覆盖状态0 父节点需要添加摄像头
if(left==0 || right==0){
result++;
return 1;
}
//情况3 左右孩子至少一个有摄像头1 父节点需为有覆盖状态
if(left==1 || right==1) return 2;
return -1;
}
int minCameraCover(TreeNode* root) {
//情况4 根节点无覆盖状态 需添加摄像头
if(traversal(root)==0) result++;
return result;
}
};
- 时间复杂度: O(n),需要遍历二叉树上的每个节点
- 空间复杂度: O(n)