LeetCode-056-合并区间
合并区间
题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:递归
递归的过程如下:
- 如果intervals为空或者intervals只有一个元素即只有1个区间,不需要合并处理,直接返回intervals;
- 如果intervals不止有1个元素,声明一个变量length记录intervals一维的长度(即有多少个区间),变量match记录不需要合并的区间的数量,matchFirst和matchSecond记录当前需要匹配的区间的2个数,然后再声明一个boolean数组flag记录区间是否已经被合并,然后用双重循环来判断那些区间是可以合并的,处理过程如下:
- 外层循环i是第一个区间开始,matchFirst和matchSecond记录i对应区间的2个值并且match加1;
- 内层循环j从第i+1个区间开始,curFirst和curSecond记录j对应区间的2个值,然后用matchFirst、matchSecond、curFirst、curSecond来判断i和j这2个区间是否有交集,如果有交集,则更新i区间的2个数,并更新matchFirst和matchSecond,并且将j的区间标记为true即已被合并;如果没有交集,则处理下一个;
- 双重循环处理完后,判断match和length是否相等,如果相等,说明没有可合并的区间,返回intervals;如果不相等,则初始化一个新的二维数组newIntervals,将intervals中没有被合并的区间(根据flag数组判断是否已被合并)拷贝到newIntervals,然后递归调用
merge(newIntervals)。
public class LeetCode_056 {
public static int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 1) {
return intervals;
}
int length = intervals.length, match = 0, matchFirst, matchSecond;
boolean[] flag = new boolean[length];
for (int i = 0; i < length; i++) {
if (!flag[i]) {
matchFirst = intervals[i][0];
matchSecond = intervals[i][1];
match++;
for (int j = i + 1; j < length && !flag[j]; j++) {
int curFirst = intervals[j][0], curSecond = intervals[j][1];
if (((matchFirst >= curFirst && matchFirst <= curSecond) || (matchSecond >= curFirst && matchSecond <= curSecond)) ||
((curFirst >= matchFirst && curFirst <= matchSecond) || (curSecond >= matchFirst && curSecond <= matchSecond))) {
// 有交集
matchFirst = Math.min(matchFirst, curFirst);
matchSecond = Math.max(matchSecond, curSecond);
intervals[i][0] = matchFirst;
intervals[i][1] = matchSecond;
flag[j] = true;
}
}
}
}
if (match == length) {
return intervals;
}
int[][] newIntervals = new int[match][2];
for (int i = 0, j = 0; i < length; i++) {
if (!flag[i]) {
newIntervals[j] = intervals[i];
j++;
}
}
return merge(newIntervals);
}
public static void main(String[] args) {
int[][] intervals = new int[][]{{1, 4}, {2, 3}};
for (int[] ints : merge(intervals)) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
}
}
【每日寄语】 当你不开心的时候,你就可以吃一块糖果,然后告诉自己生活还是甜甜的,加油。
LeetCode-056-合并区间的更多相关文章
- LeetCode 56. 合并区间(Merge Intervals)
题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...
- Java实现 LeetCode 56 合并区间
56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...
- 力扣leetcode 56. 合并区间
56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...
- LeetCode 56 合并区间
题目: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [ ...
- leetcode 56 合并区间 JAVA
题目: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [ ...
- leetcode 56合并区间 java
//先排序,将左区间小的放在前面,然后如果前一个的右区间大于下一个的左区间,则可以合并,分别用两个下标指向当前的大区间和将要考察的小区间 class Solution { public int[ ...
- [LeetCode] Merge Intervals 合并区间
Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...
- 【LeetCode】数组--合并区间(56)
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
- LeetCode(56):合并区间
Medium! 题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18] ...
- leetcode合并区间
合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...
随机推荐
- c++ constexpr用法
测试环境:windows10 + gcc8.1 1.constexpr产生背景 c++11以后,为了保证写出的代码比以往任何时候的执行效率都要好而进行了许多改善.其中,这种改善之一就是生成常量表达式, ...
- debian老版本下载地址
https://cdimage.debian.org/cdimage/archive/
- c++14新特性
1.函数返回值类型推导 c++14对函数返回类型推导规则做了优化: auto func(int i) { //C++11编译非法,c++14支持auto返回值类型推导 return i; } int ...
- 微服务架构 | 10.1 使用 Sleuth 追踪服务调用链
目录 前言 1. Sleuth 基础知识 1.1 Sleuth 原理 2. 在服务中使用 Sleuth 追踪 2.1 引入 pom.xml 依赖文件 2.2 查看日志信息 最后 前言 参考资料: &l ...
- JAVA多线程学习十五 - 阻塞队列应用
一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...
- oracle锁表问题处理
文章转载自:http://blog.itpub.net/31397003/viewspace-2142672/ "ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或 ...
- NoSQL 之Redis的5大数据类型
NoSQL 之Redis的5大数据类型 Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisO ...
- shell基础——数组
定义数组 #小括号,空格 arr=(v1 v2 v3) arr=(`ls`) 打印数组 echo ${arr[0]} #下标从0开始 echo ${arr[*]} #整个数组 echo ${arr[@ ...
- 微服务与SpiringBoot
微服务: 微服务是一种架构风格,一般说到微服务都会说"微服务架构",即一个系统的各个功能(如结账,用户等)独立出来,以及各个服务独立出来,每个模块是可独立替换.可独立升级的软件单元 ...
- selenium学习路线
1.配置你的测试环境,针对你所学习语言,来配置你相应的selenium 测试环境.selenium 好比定义的语义---"问好",假如你使用的是中文,为了表术问好,你的写法是& ...