一个人的朝圣 — LeetCode打卡第37天
知识总结
贪心算法最后一章节, 巧在思路。
Leetcode 738. 单调递增的数字
题目说明
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
代码说明
算法思路: 从右往左遍历,碰到num[i] > num[i+1], 比如98, 那就将这个9减1,高位变成9. 最后就变成89
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] list = s.toCharArray();
int start = s.length();
for(int i = list.length -2; i>= 0; i--){
if(list[i] > list[i+1]){
list[i] = (char) (list[i] - 1);
start = i+1;
}
}
for(int i = start; i< list.length; i++){
list[i] = '9';
}
return Integer.parseInt(String.valueOf(list));
}
}
Leetcode 968. 监控二叉树
题目说明
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
代码说明
从叶子节点到根节点从下到上的遍历, 采取后续遍历的方法。
分三种情况来讨论。
class Solution {
int result = 0;
public int minCameraCover(TreeNode root) {
// 0 no cover
// 1 cover but no camera
// 2 camera
if(dfs(root) == 0){
result++;
}
return result;
}
public int dfs(TreeNode cur){
if(cur == null){
return 1;
}
int left = dfs(cur.left);
int right = dfs(cur.right);
if(left == 0 || right == 0){
result++;
return 2;
}
if(left == 2 || right == 2){
return 1;
}
// left == 1 && right == 1
return 0;
}
}