当前位置: 首页 > news >正文

代码随想录day31 贪心part05

56.合并区间

以数组 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].
示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路

首先还是按照左边界排序。接下来合并区间。
直接在res里合并。

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return a[0] - b[0];
            }
        });
        List<int[]> res = new ArrayList<>();
        res.add(intervals[0]);
        for (int i = 1; i < intervals.length; i++) {
            if (res.get(res.size() - 1)[1] >= intervals[i][0]) {
                res.get(res.size() - 1)[1] = Math.max(res.get(res.size() - 1)[1], intervals[i][1]);
            } else {
                res.add(intervals[i]);
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}

738.单调递增的数字

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

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

示例 1:

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

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

输入: n = 332
输出: 299

思路

一旦出现s[i-1]大于s[i],非单调递增,首先要让s[i-1]–,比如332,3变成2。
从后向前遍历,332->329->299,获得了最前面的-1的位置,然后后面都是9即可。

class Solution {
    public int monotoneIncreasingDigits(int n) {
        char[] s = String.valueOf(n).toCharArray();
        int flag = s.length;
        for (int i = s.length - 1; i > 0; i--) {
            if (s[i - 1] > s[i]) {
                flag = i;
                s[i - 1]--;
            }

        }
        for (int i = flag; i < s.length; i++) {
            s[i] = '9';
        }
        return Integer.parseInt(new String(s));
    }
}

968.监控二叉树

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

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

计算监控树的所有节点所需的最小摄像头数量。
在这里插入图片描述

思路

首先发现摄像头都没有放到叶节点上。
局部最优:叶节点的父节点安摄像头
整体最优:全部摄像头数量最少
所以从下向上,先给叶节点的父节点放摄像头,然后隔两个节点放一个摄像头。
遍历顺序:左右中,从下向上,后序遍历
定义每个节点的状态:

  • 节点无覆盖:0
  • 节点有摄像头:1
  • 节点有覆盖:2
    空节点表示有覆盖,这样就可以不在叶节点放摄像头了。
class Solution {
    int result;

    public int minCameraCover(TreeNode root) {
        result = 0;
        if (traversal(root) == 0) {
        	// 头节点无覆盖,安装摄像头
            result++;
        }
        return result;
    }

    int traversal(TreeNode root) {
    	// 空节点有覆盖,返回2
        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) {
            result++;
            return 1;
        }
        // 左节点或右节点是摄像头,该节点有覆盖
        if (left == 1 || right == 1) {
            return 2;
        }
        return -1;
    }
}
http://www.dtcms.com/a/99494.html

相关文章:

  • 蓝桥杯真题------R格式(高精度乘法,高精度加法)
  • Flutter 开发环境配置--宇宙级教学!
  • 【通道注意力机制】【SENet】Squeeze-and-Excitation Networks
  • 高并发系统下的订单号生成服务设计与实现
  • Node.js Express 安装并使用 nodemon
  • 多路径 TCP 调度的另一面
  • Vue3 事件处理
  • 英伟达GB300新宠:新型LPDDR5X SOCAMM内存
  • 【12】Ajax的原理和解析
  • C语言之链表增删查改
  • 【Java SE】Java比较器:Comparable、Comparator
  • Python的ASGI Web 服务器之uvicorn
  • 图解AUTOSAR_SWS_SynchronizedTimeBaseManager
  • Vue——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs
  • JAVA反序列化深入学习(八):CommonsCollections6
  • python 上下文管理器with
  • CKS认证 | Day3 K8s容器运行环境安全加固
  • 实战篇Redis
  • 动力电池热失控:新能源汽车安全的“隐形火山”如何预防?
  • 蓝桥杯 之 二分
  • 8、linux c 信号机制
  • sass报错,忽略 Sass 弃用警告,降级版本
  • 笔记本裸机安装centos,找不到wifi设备问题
  • 英语学习笔记1
  • 命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?
  • 【Linux网络与网络编程】01.初识网络
  • 【设计模式】状态模式
  • Redis 分布式锁实现深度解析
  • RHCA核心课程技术解析5:红帽高可用性集群架构与深度实践
  • 基于Huggingface的lerobot项目在so-arm100机械臂上的复现笔记