题目与题解
参考资料:贪心总结
738.单调递增的数字
题目链接:738.单调递增的数字
代码随想录题解:738.单调递增的数字
解题思路:
一开始想复杂了,赋值的时候就手忙脚乱,看答案了。
看完代码随想录之后的想法
其实逻辑非常单纯,依次从数字的末尾开始往高位比较,如果不符合单调递增的原理,就把当前位的数字减一,同时把后面的所有数字都变成9,一定是最大的数。
为了做起来方便,可以将输入的数字转换为字符数组,这样修改其中每一位数的时候会简单很多。另外,最好从最小位往高位遍历,同时记录要变成9的数字起始位置,方便后续数字的修改。
class Solution {
public int monotoneIncreasingDigits(int n) {
if (n <= 9) return n;
String[] s = (n + "").split("");
int flag = s.length;
for (int i = s.length - 1; i > 0 ; i--) {
if (Integer.parseInt(s[i]) < Integer.parseInt(s[i-1])) {
flag = i;
s[i-1] = Integer.parseInt(s[i-1]) - 1 + "";
}
}
for (int i = flag; i < s.length; i++) {
s[i] = "9";
}
return Integer.parseInt(String.join("", s));
}
}
遇到的困难
看过思路以后,一开始想用StringBuilder接收n,然后修改其中的参数,但是不知道为什么setCharAt(i)的时候先读取字符再对其进行-1处理数据类型会变成int,也不知道如何变回char,最后还是老老实实用string数组接收n了,java在字符串处理这一块不是特别好用。
968.监控二叉树
题目链接:968.监控二叉树
代码随想录题解:968.监控二叉树
视频讲解:贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树_哔哩哔哩_bilibili
解题思路:
从善如流,二刷再说
看完代码随想录之后的想法
在此先记录一下,感觉很难写。
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
// 对根节点的状态做检验,防止根节点是无覆盖状态 .
if(minCame(root)==0){
res++;
}
return res;
}
/**
节点的状态值:
0 表示无覆盖
1 表示 有摄像头
2 表示有覆盖
后序遍历,根据左右节点的情况,来判读 自己的状态
*/
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){
//(2,2)
return 0;
}else if(left==0||right==0){
// 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头
// (0,0) (0,1) (0,2) (1,0) (2,0)
// 状态值为 1 摄像头数 ++;
res++;
return 1;
}else{
// 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,
// 那么本节点就是处于被覆盖状态
return 2;
}
}
}
遇到的困难
下次
今日收获
贪心算法到这里正式结束了。贪心算法说白了就是一些常识的模拟,用到了一些贪心的思维,但没有固定的套路,如何找到局部最优,如何判断局部最优是否能构成全局最优,非常依赖数学直觉。尽量把这几道题都做熟吧,以不变应万变。