品牌做网站,家具网站策划书,wordpress如何添加关键词,山西营销网站建设联系方式738. 单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x y 时#xff0c;我们称这个整数是单调递增的。
给定一个整数 n #xff0c;返回 小于或等于 n 的最大数字#xff0c;且数字呈 单调递增 。
示例 1:
输入: n 10
输出: 9
思路:
假设这个数是98,…
738. 单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x y 时我们称这个整数是单调递增的。
给定一个整数 n 返回 小于或等于 n 的最大数字且数字呈 单调递增 。
示例 1:
输入: n 10
输出: 9
思路:
假设这个数是98,n[i]n[i1],让n[i]--,n[i1]9,即98的单调递增数就是89
如果从前往后遍历,n[i1]不仅受n[i]影响,还受n[i2]影响,例如332-329 这时 3又比2大了
如果从后往前遍历,332-329-299,重复利用了上一次的结果
总体来说,从后往前遍历,遇见n[i]n[i1]的情况,让n[i]-1,让i1与之后的位置都变为9 class Solution {public int monotoneIncreasingDigits(int n) {String sString.valueOf(n);char[] charss.toCharArray();int indexs.length();//记录开始填9的位置for(int ichars.length-2;i0;i--){if(chars[i]chars[i1]){chars[i]--;indexi1;}}for(int iindex;is.length();i ){chars[i]9;}return Integer.parseInt(String.valueOf(chars));}
} 968. 监控二叉树 给定一个二叉树我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。 示例 1 输入[0,0,null,0,0]
输出1
解释如图所示一台摄像头足以监控所有节点。示例 2 输入[0,0,null,0,null,0,null,null,0]
输出2
解释需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。提示
给定树的节点数的范围是 [1, 1000]。每个节点的值都是 0。 思路:
把摄像头优先放在叶节点的父节点上
所以我们要从下往上看局部最优让叶子节点的父节点安摄像头所用摄像头最少整体最优全部摄像头数量所用最少
在二叉树中如何从低向上推导呢
可以使用后序遍历也就是左右中的顺序这样就可以在回溯的过程中从下到上进行推导了。
如何隔两个节点放一个摄像头?
我们分别有三个数字来表示
0该节点无覆盖1本节点有摄像头2本节点有覆盖
遇见空结点怎么办? 空节点的状态只能是有覆盖这样就可以在叶子节点的父节点放摄像头了 单层递归逻辑: 情况1左右节点都有覆盖 左孩子有覆盖右孩子有覆盖那么此时中间节点应该就是无覆盖的状态了。 情况2左右节点至少有一个无覆盖的情况 如果是以下情况则中间节点父节点应该放摄像头
left 0 right 0 左右节点无覆盖left 1 right 0 左节点有摄像头右节点无覆盖left 0 right 1 左节点有无覆盖右节点摄像头left 0 right 2 左节点无覆盖右节点覆盖left 2 right 0 左节点覆盖右节点无覆盖
这个不难理解毕竟有一个孩子没有覆盖父节点就应该放摄像头。
此时摄像头的数量要加一并且return 1代表中间节点放摄像头。 情况3左右节点至少有一个有摄像头 如果是以下情况其实就是 左右孩子节点有一个有摄像头了那么其父节点就应该是2覆盖的状态
left 1 right 2 左节点有摄像头右节点有覆盖left 2 right 1 左节点有覆盖右节点有摄像头left 1 right 1 左右节点都有摄像头 情况4头结点没有覆盖 以上都处理完了递归结束之后可能头结点 还有一个无覆盖的情况
这时要给根节点加上摄像头
/*** 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 res0;//摄像头的个数public int minCameraCover(TreeNode root) {if(travel(root)0)res;//如果根节点没覆盖,给根节点加摄像头,因为根节点没有父节点return res;}public int travel(TreeNode cur){if(curnull)return 2;//空结点表示有覆盖int left travel(cur.left);int right travel(cur.right);//如果左右都返回覆盖,则当前结点没覆盖if(left2right2){return 0;}else if(left0||right0){//如果左右有任一个没覆盖,则在当前结点加摄像头res;return 1;} else{//如果左右有任一个有摄像头,则当前结点被覆盖return 2;}}
} 80. 翻转
时间限制1.000S 空间限制256MB
题目描述
小蓝用黑白棋的 n 个棋子排成了一行他在脑海里想象出了一个长度为 n 的 01 串 T他发现如果把黑棋当做 1白棋当做 0这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定如果在 S 中发现一个棋子和它两边的棋子都不一样就可以将其翻转变成另一个颜色。也就是说如果 S 中存在子串 101 或者 010就可以选择将其分别变为 111 和 000这样的操作可以无限重复。 小蓝想知道最少翻转多少次可以把 S 变成和 T 一模一样。
输入描述
输入包含多组数据。 输入的第一行包含一个正整数 D 表示数据组数。 后面 2D 行每行包含一个 01 串每两行为一组数据第 2i − 1 行为第 i 组 数据的 Ti第 2i 行为第 i 组数据的 SiSi 和 Ti 长度均为 ni。
输出描述
对于每组数据输出一行包含一个整数表示答案如果答案不存在请输出 −1。
输入示例
2
1000111
1010101
01000
11000
输出示例
2
-1
提示信息
对于 20% 的评测用例1 ≤ ∑D1 ni ≤ 10 对于所有评测用例保证 1 ≤ ∑D1 ni ≤ 106 ni 0 。 思路:从左往右遍历,遇见不一样的就翻转,注意开头和最后一个是不能翻转的
import java.util.*;
import java.util.stream.Stream;class Main{public static void main(String[] args){Scanner innew Scanner(System.in);int nin.nextInt();while(n--0){String s1in.next();String s2in.next();System.out.println(solve(s1,s2));}}public static int solve(String s1,String s2){int count0;for(int i0;is1.length();i){if(s1.charAt(i)s2.charAt(i)){continue;}else{if(i0||is2.length()-1||s2.charAt(i)s2.charAt(i-1)||s2.charAt(i)s2.charAt(i1)){return -1; }count;}}return count;}}