赞
踩
题目链接: 738.单调递增的数字
文章/视频链接: 738.单调递增的数字
int型数字转换为字符串再转化为字符数组
char[] strN = Integer.toString(n).toCharArray();
字符数组转化为字符串再转化为Int型数字的两种方式
Integer.parseInt(new String(strN));
Integer.parseInt(String.valueOf(chars));
// 贪心 class Solution { public int monotoneIncreasingDigits(int n) { char[] strN = Integer.toString(n).toCharArray(); int flag = strN.length; for(int i = strN.length - 1; i>0; i--){ if(strN[i-1] > strN[i]){ strN[i-1]--; flag = i; } } for(int i = flag; i < strN.length; i++){ strN[i] = '9'; } return Integer.parseInt(new String(strN)); } }
本题是贪心和二叉树的一个结合,比较难,一刷大家就跳过吧。
题目链接: 968.监控二叉树
文章/视频链接: 968.监控二叉树
我们要从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
我们分别有三个数字来表示:
空节点的状态只能是有覆盖,这样就可以在叶子节点的父节点放摄像头了
// 贪心+二叉树 class Solution { int res = 0; public int minCameraCover(TreeNode root) { // 情况4:对根节点的状态做检验,防止根节点是无覆盖状态 . if(minCame(root) == 0){ res++; } return res; } public int minCame(TreeNode root){ if(root == null){ // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 return 2; } int left = minCame(root.left); // 左 int right = minCame(root.right); // 右 // 中 if(left == 2 && right == 2){ // 情况1 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头 return 0; }else if(left == 0 || right == 0){ // 情况2 左右节点至少有一个是无覆盖状态,那 根节点此时应该放一个摄像头 res++; return 1; }else{ // 情况3 左右节点至少存在 1个摄像头 那么本节点就是处于被覆盖状态 return 2; } } } /** 节点的状态值: 0 表示无覆盖 1 表示 有摄像头 2 表示有覆盖 后序遍历,根据左右节点的情况,来判读 自己的状态 */
可以看看贪心算法的总结,贪心本来就没啥规律,能写出个总结篇真的不容易了。

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。