到哪里建网站,使用网站模板侵权吗,忘记了wordpress,服务器安装网站文章目录 前言一、738.单调递增的数字二、968.监控二叉树总结 前言
可以吗#xff1f; 一、738.单调递增的数字 本题只要想清楚个例#xff0c;例如98#xff0c;一旦出现strNum[i - 1] strNum[i]的情况#xff08;非单调递增#xff09;#xff0c;首先想让strNum… 文章目录 前言一、738.单调递增的数字二、968.监控二叉树总结 前言
可以吗 一、738.单调递增的数字 本题只要想清楚个例例如98一旦出现strNum[i - 1] strNum[i]的情况非单调递增首先想让strNum[i - 1]减一strNum[i]赋值9这样这个整数就是89。就可以很自然想到对应的贪心解法了。 想到了贪心还要考虑遍历顺序只有从后向前遍历才能重复利用上次比较的结果。 最后代码实现的时候也需要一些技巧例如用一个flag来标记从哪里开始赋值9。 下面代码的flag为startflag是为了标识使得后面变为9的位置防止1000得出900的操作正确999亦或是234得出199正确234。
1和2相同只是更改了length与length以及start---flag
class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] ch s.toCharArray();int start s.length();for(int i start-1;i0;i--)if(ch[i-1] ch[i]){ch[i-1]--;start i;}for(int i start;is.length();i){ch[i] 9;}return Integer.parseInt(String.valueOf(ch));}
}class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] ch s.toCharArray();int flag ch.length;for(int i flag-1;i0;i--){if(ch[i-1] ch[i]){ch[i-1]--;flag i;}}for(int i flag;i ch.length;i){ch[i] 9;}return Integer.parseInt(String.valueOf(ch));}
} 二、968.监控二叉树 从题目中示例其实可以得到启发我们发现题目示例中的摄像头都没有放在叶子节点上这是很重要的一个线索摄像头可以覆盖上中下三层如果把摄像头放在叶子节点上就浪费的一层的覆盖。所以把摄像头放在叶子节点的父节点位置才能充分利用摄像头的覆盖面积。那么有同学可能问了为什么不从头结点开始看起呢为啥要从叶子节点看呢 因为头结点放不放摄像头也就省下一个摄像头 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。所以我们要从下往上看局部最优让叶子节点的父节点安摄像头所用摄像头最少整体最优全部摄像头数量所用最少局部最优推出全局最优找不出反例那么就按照贪心来 此时大体思路就是从低到上先给叶子节点父节点放个摄像头然后隔两个节点放一个摄像头直至到二叉树头结点。此时这道题目还有两个难点 二叉树的遍历如何隔两个节点放一个摄像头 有如下三种 该节点无覆盖本节点有摄像头本节点有覆盖 我们分别有三个数字来表示 0该节点无覆盖1本节点有摄像头2本节点有覆盖 大家应该找不出第四个节点的状态了。 一些同学可能会想有没有第四种状态本节点无摄像头其实无摄像头就是 无覆盖 或者 有覆盖的状态所以一共还是三个状态。 因为在遍历树的过程中就会遇到空节点那么问题来了空节点究竟是哪一种状态呢 空节点表示无覆盖 表示有摄像头还是有覆盖呢 空节点不能是无覆盖的状态这样叶子节点就要放摄像头了空节点也不能是有摄像头的状态这样叶子节点的父节点就没有必要放摄像头了而是可以把摄像头放在叶子节点的爷爷节点上。 所以空节点的状态只能是有覆盖这样就可以在叶子节点的父节点放摄像头了; 本题的难点首先是要想到贪心的思路然后就是遍历和状态推导。 在二叉树上进行状态推导其实难度就上了一个台阶了需要对二叉树的操作非常娴熟。 /** 节点的状态值 0 表示无覆盖 1 表示 有摄像头 2 表示有覆盖 后序遍历根据左右节点的情况,来判读 自己的状态 */
// 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头 (2,2
// 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头 (0,0) (0,1) (0,2) (1,0) (2,0)状态值为 1摄像头数 ;
// 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头那么本节点就是处于被覆盖状态
class Solution {int res0;public int minCameraCover(TreeNode root) {// 对根节点的状态做检验,防止根节点是无覆盖状态 .if(minCame(root)0){res;}return res;}/**节点的状态值0 表示无覆盖1 表示 有摄像头2 表示有覆盖后序遍历根据左右节点的情况,来判读 自己的状态*/public int minCame(TreeNode root){if(rootnull){// 空节点默认为 有覆盖状态避免在叶子节点上放摄像头return 2;}int leftminCame(root.left);int rightminCame(root.right);// 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头if(left2right2){//(2,2)return 0;}else if(left0||right0){// 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头// (0,0) (0,1) (0,2) (1,0) (2,0)// 状态值为 1 摄像头数 ;res;return 1;}else{// 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头// 那么本节点就是处于被覆盖状态return 2;}}
}总结
我们可以的
只要一路坚持下来不仅基础扎实而且进步也是飞速的。