文章目录
738.单调递增的数字 
思路
最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9.
如100不能单纯的变为090. 而应该后面的都为9也就是099
代码
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);//转为字符串
char[] chars = s.toCharArray();//转为字符数组
int flag=s.length();//定义设置为9的开始位置
for (int i = s.length() - 2; i >= 0; i--) {
if(chars[i]>chars[i+1]){
chars[i]--;
flag=i+1;//设置起始位置
// chars[i+1]='9';
}
}
for(int i=flag;i<chars.length;i++){
chars[i]='9';//赋值为9
}
return Integer.parseInt(String.valueOf(chars));
}
}
968.监控二叉树-hard
本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。
在二叉树上进行状态推导,其实难度就上了一个台阶了,需要对二叉树的操作非常娴熟。
这道题目是名副其实的hard,大家感受感受。
思路:
/**
节点的状态值:
0 表示无覆盖
1 表示 有摄像头
2 表示有覆盖
后序遍历,根据左右节点的情况,来判读 自己的状态
*/
情况一
情况二
情况三:
情况四:
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
if(minCame(root)==0){
res++;
}
return res;
}
/**
节点的状态值:
0 表示无覆盖
1 表示 有摄像头
2 表示有覆盖
后序遍历,根据左右节点的情况,来判读 自己的状态
*/
public int minCame(TreeNode root){
// 空节点,该节点有覆盖
if(root==null)return 2;
// 后序遍历.判断左右节点状态
int left=minCame(root.left); // 左
int right=minCame(root.right); // 右
// 情况1
// 左右节点都有覆盖
if(left==2&&right==2)return 0;
// 情况2
// 左右节点有一个没被覆盖
if(left==0||right==0){
res++;
return 1;
}
// 情况3
// 左右节点zhishao有一个有摄像头
if(left==1||right==1){
return 2;
}
// 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解
// 这个 return -1 逻辑不会走到这里。
return -1;
}
}