代码随想录day28 | leetcode 56.合并区间 738.单调自增的数字 968.监控二叉树

合并区间

题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

解法:重叠区域类似。

java 复制代码
 public int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return new int[0][];
        }
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        List<int[]> result = new LinkedList<>();
//这在更改原数组,易造成元素丢失。
        int[] currentInterval = intervals[0];
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] > currentInterval[1]) {
                result.add(currentInterval);
                currentInterval = intervals[i];
            } else {
                currentInterval[1] = Math.max(currentInterval[1], intervals[i][1]);
            }
        }
        result.add(currentInterval);
        return result.toArray(new int[result.size()][]);

    }
单调递增的数字

题目:当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增 的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增
示例 1:

输入: n = 332
输出: 299

解法::首先想让strNum[i - 1]减一,strNum[i]赋值9。从后往前遍历。

java 复制代码
public int monotoneIncreasingDigits(int n) {
    String s = String.valueOf(n);
    char[] nums = s.toCharArray();
    int flag = s.length();//遍历的时候不符合的之后的数改为9.
    for (int i = s.length()-2; i >= 0 ; i--) {
        if (nums[i] > nums[i+1]){
            nums[i]--;
            flag = i +1;
        }
    }
    for (int i = flag; i < s.length(); i++) {
        nums[i] = '9';
    }
    return Integer.parseInt(String.valueOf(nums));
}

监控二叉树

题目:给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

贪心:找到链接最多的节点。整体采取后序遍历。让叶子节点的父节点有摄像头。

每个节点的状态:1.有摄像头。2.有覆盖。0.覆盖。空节点为有覆盖。

整体情况:一个摄像头最大可以覆盖上层与下层。

  1. 左右都有覆盖。(空节点为状态2)
  2. 左右至少有一个状态0
  3. 左右至少有一个状态2。
  4. 根节点需要有状态1。
图解
              a
           / 
         x
       / \  
      Z   Y

java 复制代码
class Solution {
       int result = 0;
    public int minCameraCover(TreeNode root) {
        if (traval(root) == 0){
           result++;
       }
       return result;
    }
   

    public int  traval(TreeNode node){
        if (node == null){
            return 2;//返回状态
        }
        int left = traval(node.left);
        int right = traval(node.right);
        if(left ==2 &&right == 2 ){
            return 0;
        }
        if (left == 0 ||right ==0){
            // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头
            // (0,0) (0,1) (0,2) (1,0) (2,0)
            // 状态值为 1 摄像头数 ++;
            result++;
            return 1;
        }
        if (left == 1 ||right ==1){
            // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,
            // 那么本节点就是处于被覆盖状态
            return 2;
        }
        return -1;
    }
}
相关推荐
siy233322 分钟前
[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
c语言·开发语言·笔记·学习·算法
van叶~24 分钟前
算法妙妙屋-------2..回溯的奇妙律动
c++·算法
闲人编程2 小时前
PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析
python·算法·pid·路径规划·微分控制·积分控制·比例控制
诚丞成2 小时前
字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)
c++·算法
自信的小螺丝钉5 小时前
Leetcode 279. 完全平方数 动态规划 完全背包问题
算法·leetcode·动态规划
努力的泽泽5 小时前
【动态规划-矩阵】5.下降路径最小和
算法·矩阵·动态规划
埃菲尔铁塔_CV算法8 小时前
双线性插值算法:原理、实现、优化及在图像处理和多领域中的广泛应用与发展趋势(二)
c++·人工智能·算法·机器学习·计算机视觉
叫我龙翔8 小时前
【算法日记】从零开始认识动态规划(一)
c++·算法·动态规划·代理模式
AC100AC8 小时前
[NOIP2007 提高组] 矩阵取数游戏
算法·游戏·矩阵
深度混淆8 小时前
C#,图论与图算法,输出无向图“欧拉路径”的弗勒里(Fleury Algorithm)算法和源程序
算法·图论