Day31 贪心算法 part05

server/2024/12/2 14:58:37/

56. 合并区间

本题也是重叠区间问题,如果昨天三道都吸收的话,本题就容易理解了。

代码随想录

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

总结

1.本题的套路还是判断重叠区间问题。和射气球是一样的套路,只是判断条件和判断后的更新操作有所不同。

2.还是一样的套路,我们先对左边界进行排序,让所有的相邻区间尽可能的重叠在一起。如果intervals[i][0] <= intervals[i-1][1]说明当前段的边界和上一个边界有重叠,然后对当前边界进行跟新,需要更新当前边界的左边取最小值,然后更新当前边界的右边取最大值。如果判断没有重叠,就把上一段区间加入到集合里面。注意for循环之后,其实最后一段区间是没有加入到集合里面的,我们需要在for循环之后,单独把最后一段区间加入到集合里面。最后把集合result.toArray(new int[0][])转为二维数组。

738.单调递增的数字

代码随想录

class Solution {public int monotoneIncreasingDigits(int n) {//一开始不知道怎么处理整数的每一位,其实转为字符串或者字符数组处理就可以了String num = String.valueOf(n);char[] chars = num.toCharArray();int flag = chars.length;for(int i = chars.length - 1; i > 0; i--){if(chars[i] < chars[i-1]){chars[i-1]--;flag = i;}}for(int i = flag; i < chars.length; i++){chars[i] = '9';}return Integer.parseInt(new String(chars));}
}

总结

1.这道题只需要想明白我们要遵循的处理逻辑就可以。就是如果碰到前一位的数字比当前位高,那我们就把前一位数字减1,当前数字应该变成9。想明白这个就好做了。然后还有一个难点就是应该前序遍历还是后序遍历,这种情况可以自己模拟一下,对于这道题,应该是后序遍历,因为后序遍历可以利用到前一次处理的结果。最后一个难点就是我们不应该是直接把当前数字变成9,而是设置一个flag,让flag后面的数字全变成9,这是为了防止1000,这种情况,如果不使用flag,就是900,而不是999。还有flag的初始不能为0,因为如果碰到1234,这种就不需要处理flag,所以我们应该初始为 int flag = chars.length;

2.一开始不知道怎么处理整数的每一位,其实转为字符串或者字符数组处理就可以了,后面再通过Integer.parseInt()转为int类型。然后基本数据类型是没有toString方法的。

3.这道题关键是想到个例怎么处理,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后想到使用flag来标记从哪里开始赋值9。

968.监控二叉树 (可跳过)

本题是贪心和二叉树的一个结合,比较难,一刷大家就跳过吧。

代码随想录

总结

总结

可以看看算法>贪心算法的总结,贪心本来就没啥规律,能写出个总结篇真的不容易了。

代码随想录


http://www.ppmy.cn/server/146747.html

相关文章

学习线性表_3

单链表的删除 直接删除即可删除后要free //删除第i个位置的元素 //删除时L是不会变的&#xff0c;所以不需要加引用 bool ListDelect(LinkList L,int i) {//i 1,即删除头指针//拿到要删除结点的前一个结点LinkList p GetElem(L,i-1);if(NULLp){return false;}//拿到要删除的结…

自由学习记录(26)

streamingAsset在ab包的参与的总结 意思是我正在做一个游戏&#xff0c;我目前就相当于在做种子库的ab包&#xff0c;最后游戏上线之后&#xff0c;在玩家那边&#xff0c;加载ab包&#xff0c;肯定会优先判断这个种子库&#xff0c;而我后期要改的话&#xff0c;就传新的ab包…

深度学习模型: BERT(Bidirectional Encoder Representations from Transformers)详解

一、引言 自然语言处理&#xff08;NLP&#xff09;领域在过去几十年取得了显著的进展。从早期基于规则的方法到统计机器学习方法&#xff0c;再到如今基于深度学习的模型&#xff0c;NLP 不断向着更高的准确性和效率迈进。BERT 的出现为 NLP 带来了新的突破&#xff0c;它能够…

一些面试问题的深入与思考

Bug排查 原问题&#xff1a;多个服务的bug你是怎么排查的。如果是内存泄漏这种情况看日志看不了怎么办。 题解&#xff1a;内存泄漏的问题往往不会直接从日志中体现&#xff0c;需要用更多手段来定位解决。如下&#xff1a; 1、使用 Go 自带的性能分析工具 (1) pprof 工具&a…

Spark优化--开发调优、资源调优、数据倾斜调优和shuffle调优等

针对Spark优化&#xff0c;我们可以从多个角度进行&#xff0c;包括开发调优、资源调优、数据倾斜调优和shuffle调优等。以下是一些具体的优化方法&#xff1a; 1. 开发调优 避免创建重复的RDD&#xff1a;对于同一份数据&#xff0c;只应该创建一个RDD&#xff0c;避免创建多…

【MySQL】库和表的基本操作

目录 库 库的增删查改 字符集与校验集 库的备份与恢复 表 表的创建和删除 用不同的存储引擎创建表的区别 查看表 修改表 添加删除属性 修改改变属性 上篇博客我们讲了数据库的基本理解&#xff0c;对数据库有了一个大致的概念&#xff0c;下面我们来介绍一下库和表的…

使用开源GCC编译微软WMI相关函数的示例代码

如下代码是使用国产RedPanda-Cpp的编译工具编译的&#xff0c;该工具使用简单&#xff1b; 该方式是调用微软的WMI接口相关函数 但是使用GCC编译会出现编译不过的问题&#xff0c;很多代码库的函数都不存在&#xff1b; 在编译时&#xff0c;需要添加这些库文件&#xff1a;…

【大数据学习 | Spark调优篇】Spark之JVM调优

1. Java虚拟机垃圾回收调优的背景 如果在持久化RDD的时候&#xff0c;持久化了大量的数据&#xff0c;那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收&#xff0c;此时就会追踪所有的java对象&#xff0c;并且在垃圾回收时&#xff0c;找…