C#代码随想录算法训练营day37|贪心算法、单调递增的数字、监控二叉树

LeetCode738 单调递增的数字

题目:

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:
输入: n = 10
输出: 9

示例 2:
输入: n = 1234
输出: 1234

示例 3:
输入: n = 332
输出: 299

代码:
public class Solution {
    
    
    public int MonotoneIncreasingDigits(int n) {
    
    
        char[] array = n.ToString().ToCharArray();
        int numLength = array.Length;
        int startIndex = -1;
        for (int i = numLength - 2; i >= 0; i--)
        {
    
    
            if (array[i] > array[i + 1])
            {
    
    
                array[i]--;
                startIndex = i;
            }
        }
        if (startIndex >= 0)
        {
    
    
            for (int i = startIndex + 1; i < numLength; i++)
            {
    
    
                array[i] = '9';
            }
        }
        return int.Parse(new string(array));
    }
}

LeetCode968 监控二叉树

题目:

给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。

示例 1:
在这里插入图片描述

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

示例 2:
在这里插入图片描述

输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。

代码:
public 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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44740741/article/details/130256218