贪心算法
738.单调递增的数字
贪心思路
- 从后向前遍历数字的每一位
- 若发现前面的比当前大, 则将前面的-1, 后面的全部变成9
代码:
class Solution {
public int monotoneIncreasingDigits(int n) {
char[] ch = String.valueOf(n).toCharArray();
for(int i=ch.length-1; i>0; i--) {
if(ch[i]-'0' < ch[i-1] - '0') {
// 字符-- 代表变成其ascii编码的前一个字符
ch[i-1]--;
Arrays.fill(ch, i, ch.length, '9');
}
}
return Integer.parseInt(new String(ch));
}
}
968.监控二叉树
树上贪心:
- 前序深度优先遍历: 遍历到的节点分为三种状态
- -1 - 代表叶子节点 || 不用管
- 1 - 代表当前节点没有安装摄像头
- 2 - 代表当前节点安装有摄像机
代码:
class Solution {
int ans = 0;
// 三种状态: 叶子节点(已经被监控的节点)-不用管, 当前位置没有安装摄像头, 当前位置安装了摄像头
public int minCameraCover(TreeNode root) {
// 判断根节点是否被监控
return dfs(root) == 1 ? ans+1 : ans;
}
public int dfs(TreeNode root) {
// 叶子节点用-1标识
if(root == null) return -1;
int left = dfs(root.left);
int right = dfs(root.right);
// 定义状态:
// -1 - 代表叶子节点 || 不用管
// 1 - 代表当前节点没有安装摄像头
// 2 - 代表当前节点安装有摄像机
// 叶子节点不用安装摄像头
if(left == -1 && right == -1) {
return 1;
}else {
if(left == 1 || right == 1) {
ans++;
return 2;
// 2和-1搭配时 向上返回 -1
}else return -1;
}
}
}