力扣56. 合并区间

server/2024/9/24 0:24:58/

题目链接

力扣56. 合并区间

思路

合并

先对每个区间进行排序,左端点值小的放在前面。然后对这些区间进行合并,对于一个的结果集合,如果本区间与前一个区间不重叠,则创建一个新区间加入到这个集合中;否则取这两个区间右端点的最大值作为前一个区间的右端点,这就是合并两个区间为一个区间的操作。

排序

对于 J a v a Java Java 来说,可以使用 M a t h . s o r t ( ) Math.sort() Math.sort() 方法进行排序,即有 Arrays.sort(intervals, (interval1, interval2) -> interval1[0] - interval2[0]);,此处使用了 l a m b d a lambda lambda 表达式简化内部类的编写。
但是这样的性能不是很高,执行时间大约为 7 m s 7ms 7ms,可以自己实现一个排序的方法,本题采用定制快速排序的方法进行排序,如果对快速排序不了解,可以先看看这篇文章快速排序。

代码

java">class Solution {public int[][] merge(int[][] intervals) {// 1. 如果intervals为空,则返回空数组if (intervals.length == 0) {return new int[0][2];}// 2. 按区间左端点的大小进行排序quickSort(intervals, 0, intervals.length - 1);// 3. 对区间进行合并List<int[]> res = new ArrayList<>();for (int i = 0; i < intervals.length; i++) {int left = intervals[i][0];             // 本轮循环的区间左端点int right = intervals[i][1];            // 本轮循环的区间右端点if (res.size() == 0) {                  // 若res为空 res.add(new int[]{left, right});    // 增加一个新的区间continue;                           // 不必进行区间的比较}int[] tmp = res.get(res.size() - 1);if (tmp[1] < left) {                    // 若两个区间不重叠res.add(new int[]{left, right});    // 增加一个新的区间} else {                                // 否则tmp[1] = Math.max(tmp[1], right);   // 让区间的右端点取 原右端点 和 现右端点 的最大值}}// 4. 返回一个二维数组return res.toArray(new int[res.size()][]);}private void quickSort(int[][] intervals, int left, int right) {if (left > right) {return;}int tmp = intervals[left][0]; // 默认以数组的左端点作为基准进行排序int[] t;int i = left;int j = right;// 分区while (i < j) {// 获取大于tmp的元素的索引while (tmp <= intervals[j][0] && i < j) {j--;}// 获取小于tmp的元素的索引while (tmp >= intervals[i][0] && i < j) {i++;}// 将小于tmp的元素放在左边,将大于tmp的元素放在右边t = intervals[j];intervals[j] = intervals[i];intervals[i] = t;}// i指向小于tmp的最后一个元素,将基准放到小于tmp和大于tmp的中间int[] arr = intervals[left];intervals[left] = intervals[i];intervals[i] = arr;// 对tmp左边进行分区quickSort(intervals, left, j - 1);// 对tmp右边进行分区quickSort(intervals, j + 1, right);}
}

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

相关文章

React真的好难用

我发现React就像个宗教一样&#xff0c;网络上总有一群信徒。信徒&#xff1a;React天下第一&#xff0c;谁也不能说他不好。 网络上大佬对React的评价一般有几类&#xff1a; React跟Vue比就是手动档和自动档的区别&#xff0c;高手都开手动档。—— 就一个破打工的&#xf…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记2节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程&#xff0c;本课程深入浅出地介绍了RL的基础原理&#xff0c;前置技能只需要基础的编程能力、概率论以及一部分的高等数学&#xff0c;你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

前端css中keyframes(关键帧)的简单使用

前端css中keyframes的使用 一、前言二、例子&#xff08;一&#xff09;、例子源码1&#xff08;二&#xff09;、源码1运行效果1.视频效果2.截图效果 三、结语四、定位日期 一、前言 关键帧keyframes是css动画的一种&#xff0c;主要用于定义动画过程中某一阶段的样式变化&am…

【Docker】Docker的网络与资源控制

Docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

LeetCode 0216.组合总和 III:回溯(剪枝) OR 二进制枚举

【LetMeFly】216.组合总和 III&#xff1a;回溯(剪枝) OR 二进制枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返…

开放地址法解决哈希冲突

1.基本思想: 有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将元素存入. 2.开放地址法的常用方法: (1) 线性探测法: Hi(Hash(key)di)%m (1<i<m),其中:m为哈希表长度,di为增量序列1,2,……m-1,且dii;其实就是一旦有冲突,就找下一个空地…

(待更)DRF: 序列化器、View、APIView、GenericAPIView、Mixin、ViewSet、ModelViewSet的源码解析

前言&#xff1a;还没有整理&#xff0c;后续有时间再整理&#xff0c;目前只是个人思路&#xff0c;文章较乱。 注意路径匹配的“/” 我们的url里面加了“/”&#xff0c;但是用apifox等非浏览器的工具发起请求时没有加“/”&#xff0c;而且还不是get请求&#xff0c;那么这…