【随想录】Day37—第八章 贪心算法 part06

本文介绍了两道编程题目:如何将一个单调递增的数字转换并保持递增,以及如何使用贪心策略在二叉树中放置最少数量的摄像头以监控所有节点。解题思路涉及字符串操作、逆向遍历和二叉树后序遍历。
摘要由CSDN通过智能技术生成


题目1: 单调递增的数字


1- 思路

  • 1. 转 String:将 int 类型的数转为 String 类型,之后通过
  • 2. 逆向遍历:从后往前遍历 String
  • 3. 处理思路:从 size()-2 遍历到 i >= 0
    • 处理情况:当当前元素 i 的元素值大于 后一位 i+1 ,此时需要处理
    • 处理逻辑:令 i 的元素值为当前元素值减一,同时定义 start 记录 i 的位置

2- 题解

⭐ 单调递增的数字——题解思路

在这里插入图片描述

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String str = Integer.toString(n);
        char[] chars = str.toCharArray();
        int start = str.length();

        for (int i = str.length() - 2; i >= 0; i--) {
            if (chars[i] > chars[i + 1]) {
                chars[i]--;
                start = i+1;
            }
        }
        for(int i = start ; i<chars.length ;i++){
            chars[i] = '9';
        }
        return Integer.parseInt(String.valueOf(chars));
    }
}

题目2: 监控二叉树


1- 思路

贪心思路

  • 通过从下网上遍历的方式,则采取二叉树的 后序遍历 ,即 左右中方式
  • 在叶子结点的上一个结点放摄像头,每隔两个结点放一个摄像头,直到遍历到根节点为止

定义结点状态

  • 0 代表这个结点没覆盖
  • 1 代表这个结点有摄像头
  • 2 代表当前这个结点有覆盖的状态
  • 空节点一定是有覆盖状态,才能满足 叶子结点的父节点是有摄像头

后续遍历逻辑

  • 情况1:左右孩子都有覆盖 ——> 父节点只能是状态0,等待父节点的父节点装摄像头
  • 情况2:左右孩子至少有一个无覆盖 ——> 此时 父节点 必须要装一个摄像头,只有父节点装了摄像头才能将当前结点的另一个孩子给覆盖
  • 情况3:左右孩子有一个有摄像头 ——> 此时 父节点一定是覆盖状态
  • 情况4:根节点无覆盖 ——> 此时 要对根节点加一个摄像头

2- 题解

⭐ 监控二叉树——题解思路

在这里插入图片描述

class Solution {
    int res = 0;
    public int minCameraCover(TreeNode root) {
        if(Traversal(root)==0){
            res++;
        }
        return res;
    }


    public int Traversal(TreeNode root){
        if(root== null){
            return 2;
        }
        int left = Traversal(root.left);
        int right = Traversal(root.right);
        // 左右孩子都覆盖
        if(left==2 && right==2){
            return 0;
        }
        // 左右至少有一个无覆盖
        if(left==0 || right==0){
            res++;
            return 1;
        }
        // 左右有一个摄像头,当前被覆盖
        if(left==1 || right==1){
            return 2;
        }
        
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值