首页 > 编程语言 >Day 31 贪心算法 Part05

Day 31 贪心算法 Part05

时间:2024-08-02 13:27:44浏览次数:7  
标签:return int 31 Part05 start intervals chrs root Day

56. 合并区间

区间这类问题,不是按照左端点排序就是按照右端点排序,在思考思路的时候,就从这两个方向去下手,然后再去想贪心,以及从左侧开始遍历还是右侧开始遍历。

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

738. 单调递增的数字

思路想到了,但就是做不出来,我是真蠢啊,继续加油吧,可能努力到最后我还是一样笨,但我一定还是不会放弃。

从后向前遍历,遇到后小于前的数字,前面的数字减一(其实就是这里我怎么也绕不过来,一直都在思考,万一是0怎么办,那这里怎么操作,但其实完全不用考虑,即便减成-1,那他一定小于前一个数字,那么这一位也是需要变成9的)。使用start记录第一位要变成9的位置,如果该位置变成9,后面所有位都要变成9。因此,只记录第一位就行。

class Solution {
    public int monotoneIncreasingDigits(int n) {
        char[] chrs = Integer.valueOf(n).toString().toCharArray();
        int start = -1;
        for(int i = chrs.length - 1; i > 0; i--){
            if(chrs[i] < chrs[i-1]) {
                chrs[i-1]--;
                start = i;
            }
        }
        if(start == -1) return n;
        for(int i = start; i < chrs.length; i++){
            chrs[i] = '9';
        }
        return Integer.valueOf(new String(chrs));
    }
}

968. 监控二叉树

这道题更是重量级,根本不会一点。让我背背思路还差不多。贴下题解。讲的不错,但我想不到。后序遍历+贪心。

贪心的思路,从下到上,如果是叶子节点则不安装摄像头,因为只能覆盖自己和上一层,而如果安装在非叶子节点,则可以向上向下都覆盖到。

这道题还有一个非常巧妙的思路就是在于对节点的标识,使用0,1,2分别代表未覆盖,有摄像头以及已覆盖。这个想不到是真做不出来,然后经过这样标识后,根据左右子树的标识再反推根节点的标识。这里还有一个小的点,对于空节点,使用已覆盖来标识,这部分我只能意会了,具体还是看代码随想录的题解,讲的很清楚。

class Solution {
    int res;
    public int minCameraCover(TreeNode root) {//0,1,2分别代表未覆盖,有摄像头以及已覆盖
        int stat = traversal(root);
        if(stat == 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 == 0 || right == 0){ res++; return 1; }
        if(left == 1 || right == 1) { return 2; }
        return 0;
    }
}

标签:return,int,31,Part05,start,intervals,chrs,root,Day
From: https://www.cnblogs.com/12sleep/p/18338540

相关文章

  • 题解:CF1301B Motarack's Birthday
    CF1301DTimetoRun题解思维题。分析把一个格子视作一个点,每个点的度数都是偶数,所以这是一张欧拉图。而需要走遍整个方格图,可以证明只要\(k\)不超过\(4nm-2n-2m\)就一定有解。很明显存在很多种方案,这里我用的方案是:从左上角出发,向右走\(m-1\)步到头,再向左走\(m-1\)......
  • Day17 二叉树Part5
    目录任务654.最大二叉树思路617.合并二叉树思路700.二叉搜索树中的搜索思路98.验证二叉搜索树思路(错误)思路(正确)心得体会任务654.最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归......
  • 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计
    前言  电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。  紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路。 12V转3.3V电路步骤一:应用典型电路    (依据底板和典型电路得差别,电感和电容在3......
  • 代码随想录day17 || 654 最大二叉树,617 合并二叉树,700 二叉搜索树搜索,98 验证二叉搜索
    645最大二叉树funcconstructMaximumBinaryTree(nums[]int)*TreeNode{ //思路,算法思路基本等同于通过中序前序构造二叉树 //1,取最大值作为根节点 //2,切割数组 //3,递归左右子树 iflen(nums)==0{ returnnil } //切割数组取最大值 max,left,right:=......
  • 代码随想录算法训练营第二十一天| 39. 组合总和, 40.组合总和II, 131.分割回文串
    今天是回溯算法学习的第二天,主要的学习内容包括:1.组合问题的重复使用2.组合问题的去重3.分割问题的处理方法。39.组合总和题目链接:39.组合总和-力扣(LeetCode)这个组合问题的特点是,集合内的元素可以重复使用。与前面组合问题的区别在于,在每一次回溯中,不是从i+1的位置开......
  • day16 Java基础——JavaDoc生成文档
    day16Java基础——JavaDoc生成文档目录day16Java基础——JavaDoc生成文档1.什么是JavaDoc2.生成JavaDoc2.1通过命令行生成JavaDoc2.2使用IDEA生成JavaDoc1.什么是JavaDocJavaDoc是一种标准的、用于生成Java代码API文档的工具。它通过在Java源代码中特定的......
  • Oracle归档日志异常增长问题的排查过程 转载 : https://blog.csdn.net/3moods/article
    Oracle归档日志是Oracle数据库的重要功能,用于将数据库的重做日志文件(RedoLog)保存到归档日志文件(ArchiveLog)中。归档日志的作用是提供数据库的备份和恢复功能,以及支持数据库的持续性和数据完整性。当数据库处于归档模式时,数据库引擎会将已经写满的重做日志文件保存到归档日志文件......
  • DAY 15 二叉树part03
      110.平衡二叉树(优先掌握递归)题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 独立完成,感觉还比较好理解12classSolution{13public:14boolisBalanced(TreeNode*root){15if(......
  • 24-7-31String类,StringBuffer类,StringBuilder类的详解与比较
    24-7-31String类,StringBuffer类,StringBuilder类的详解与比较文章目录24-7-31String类,StringBuffer类,StringBuilder类的详解与比较StringString的结构String的方法String对象的两种创建方法String的其他方法String练习StringExercise01StringExercise02StringExer......
  • 嵌入式软件--C语言高级 DAY 8 函数
    函数是C语言尤为重要的知识点,再嵌入式的学习过程中,对51和32的单片机的学习是重中之重。一、函数的基本概念1.介绍函数是一种可重复使用的代码块,用于执行特定的任务或操作。函数允许我们将代码逻辑组织成独立的单元,从而提高了代码的可读性、可维护性和重用性。一个C程序可......