738.单调递增的数字
332-》329-》299
本质是当相邻位不符合条件时,局部贪心,23-》29,前一位减一,后一位变9,9也的确是最大的
class Solution {
public:
int monotoneIncreasingDigits(int n) {
//vector<string> numString=to_string(n);
string numString=to_string(n);
int flag=numString.size();//int flag=0;初始化为0的话,case1234output9999,flag=0一直没变过
for(int i=numString.size()-1;i>0;i--){
if(numString[i-1]>numString[i]){
//numString[i]='9';不能在这就变为9,case100output90
numString[i-1]--;
flag=i;
}
}
for(int i=numString.size()-1;i>=flag;i--){
numString[i]='9';
}
return stoi(numString);
}
};
968.监控二叉树
为了让摄像头数量最少,我们要尽量让叶子节点的父节点安装摄像头,这样才能摄像头的数量最少。
那么空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。
- 后序遍历,代码逻辑
- 状态更新:0无覆盖1有摄像机2有覆盖
if(root==null) return 2;
root->left=traversal(root->left);
root->right=traversal(root->right);
if(root->left==2 && root->right==2) return 0;//情况一:当左右节点都有覆盖时,目前节点无需装摄像机,摄像机应该由上一层装,所以目前是无覆盖0
if(root->left==0 || root->right==0) return 1;//情况二:但凡左右节点有一个处于无覆盖的状态,就需要父节点装摄像机了
if (left == 1 || right == 1) return 2;//情况三:如果左右节点有一个有摄像机,父节点就可以被覆盖到2.而且left=1,right=0这种情况已经在情况二中提到过了,所以注意If条件的顺序
情况四,根节点可能会处于root->left2 && root->right2但是他又没有父节点的状态,所以递归结束之后,还要判断根节点,如果没有覆盖,result++。
int minCameraCover(TreeNode* root) {
result = 0;
if (traversal(root) == 0) { // root 无覆盖
result++;
}
return result;
}