目录
一、738. 单调递增的数字
题目链接:力扣
文章讲解:代码随想录
视频讲解:
题目:
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
代码:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string num = to_string(n);
int flag = num.size();
for(int i = num.size()-1; i > 0; i--){
if(num[i-1] > num[i]){
flag = i;
num[i-1]--;
}
}
for (int i = flag; i < num.size(); i++) num[i] = '9';
return stoi(num);
}
};
时间复杂度: O(logn) 空间复杂度:O(logn)
⏲:2:34
总结:注意,一旦中间非递增,后面全为9!局部最优:后位为9。难点:(1)后序遍历方便重复利用上一次比较结果。(2)flag的更新要即时,且还要考虑无flag的情况。
二、968. 监控二叉树
题目链接:力扣
文章讲解:代码随想录
视频讲解:
题目:给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。
代码:
/**
* 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://1表示摄像头,2表示被覆盖,0表示无覆盖
int ans;
int minCameraCover(TreeNode* root) {
ans = 0;
if (!dfs(root)) ans++;
return ans;
}
int dfs(TreeNode* root){
if(!root) return 2;
int left = dfs(root->left);
int right = dfs(root->right);
if(left == 0 || right == 0){
ans++;
return 1;
}
else if(left == 2 && right == 2) return 0;
else return 2;
}
};
时间复杂度: O(n) 空间复杂度:O(n)
⏲:8:09
总结:局部最优:父节点放置摄像头--后序遍历,且叶结点不放摄像头--无结点返回值为已覆盖。
难点:(1)遍历顺序(2)返回值的各种情况。
注意:要考虑根节点的返回情况。