LC 738.单调递增的数字
题目链接:LC 738.单调递增的数字
思路:从低位向高位遍历,保存减值得最高位的位置,该位置之后都是9。
代码:
class Solution {
public:
//思路是从n下手,从右向左遍历
//因为若从左向右遍历,若遇到递减的就要减小某位值,减少之后可能与之前的也有冲突,因此不能从左向右遍历
//从右向左遍历,保持递减趋势,若非递减;就将该高位减一低位设为9,继续遍历。
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-1]>s[i]){
// s[i-1]--;
// flag = i;
// }
// }
// for(int j=flag; j<s.size(); j++){
// s[j]='9';
// }
for(int i=s.size()-2; i>=0; i--){
if(s[i]>s[i+1]){
s[i]--;
flag = i;
}
}
for(int j=flag+1; j<s.size(); j++){
s[j]='9';
}
return stoi(s);//将string转化为int
}
};
LC 968.监控二叉树
题目链接:LC 968.监控二叉树
思路:从叶子节点往上进行判断,因此用后序遍历;然后对不同的左右子树进行不同的判断;
定义为0时表示节点未被覆盖;为1时表示节点被覆盖;为2时表示节点上有摄像头
具体情况有:
空节点,则返回1,表示被覆盖状态,因为是为了保证叶子节点是未被覆盖状态(0);
若左右子节点都是被覆盖状态,则该节点返回未被覆盖状态(0),也就是上述状况,但不一定要安装摄像头;
若左右子节点至少有1个节点未被覆盖,则该节点需要安装一个摄像头,且返回状态2;
若左右子节点至少有1个节点安装摄像头,则该节点无需安装摄像头,返回状态1;
若头节点未被覆盖,则将头节点安装一个摄像头。
代码:
/**
* 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 traversal(TreeNode* cur){
if(cur == nullptr)return 1;//空节点
//单层递归逻辑
int left = traversal(cur->left);
int right = traversal(cur->right);
if(left==1 && right==1){
return 0;
}
if(left==0||right==0){
result++;
return 2;
}
if(left==2||right==2){
return 1;
}
return -1;
}
int minCameraCover(TreeNode* root) {
result = 0;
int head = traversal(root);
if(head==0){
result++;
}
return result;
}
};