合并区间

题目描述:以数组 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-合并区间的更多相关文章

  1. LeetCode 56. 合并区间(Merge Intervals)

    题目描述 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...

  2. Java实现 LeetCode 56 合并区间

    56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  3. 力扣leetcode 56. 合并区间

    56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  4. LeetCode 56 合并区间

    题目: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [ ...

  5. leetcode 56 合并区间 JAVA

    题目: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [ ...

  6. leetcode 56合并区间 java

    //先排序,将左区间小的放在前面,然后如果前一个的右区间大于下一个的左区间,则可以合并,分别用两个下标指向当前的大区间和将要考察的小区间 class Solution {    public int[ ...

  7. [LeetCode] Merge Intervals 合并区间

    Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...

  8. 【LeetCode】数组--合并区间(56)

    写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...

  9. LeetCode(56):合并区间

    Medium! 题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18] ...

  10. leetcode合并区间

    合并区间     给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

随机推荐

  1. PostgreSQL逻辑订阅

    测试环境:PostgreSQL 13.2 1.逻辑订阅简介 由于物理复制只能做到这个集群的复制,不能正对某个对象(表)进行复制,且物理复制的备库只能读,不能写.相反,逻辑订阅同时支持主备库读写,且可以 ...

  2. JAVA多线程学习十五 - 阻塞队列应用

    一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...

  3. Java线程--BlockingQueue使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html Java线程--BlockingQueue使用 阻塞队列就是内容满了之 ...

  4. Java实现二叉搜索树

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...

  5. 浅谈Java之属性赋值的先后顺序

    首先,什么是属性? 属性也叫作成员变量,是类的组成部分之一. 我们都知道Java一个类可以包含有: 属性,或者成员变量 构造器 方法,或者叫函数 代码块,或者叫程序段 内部类 那么结合这些,我们就有了 ...

  6. 用python的turtle作图(一)静态图

    最近,花了点时间,用python画图. 主要包括三部分,简单的静态图形,复杂的组合图形,图形动画. (一)画静态图形 长方形, 圆, 三角形, 平行四边形, 五角星 (二)图形的组合 笑脸, 国旗, ...

  7. Solution -「HNOI 2019」「洛谷 P5293」白兔之舞

    \(\mathcal{Description}\)   Link.   不想概括题意.jpg \(\mathcal{Solution}\)   定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...

  8. Solution -「CF 1391E」Pairs of Pairs

    \(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向图,在其上找到一条包括不少于 \(\lceil\frac{n}2\rceil\ ...

  9. suse 12 二进制部署 Kubernetets 1.19.7 - 第07章 - 部署kube-controller-manager组件

    文章目录 1.7.部署kube-controller-manager 1.7.0.创建kube-controller-manager请求证书 1.7.1.生成kube-controller-manag ...

  10. 新手菜菜之2020Kubernetes详细介绍大全

    前文 Kubernetes笔记(一):十分钟布置一套K8s环境 介绍了怎么快速建立一个k8s体系.为了持续运用k8s来布置咱们的应用,需要先对k8s中的一些根本组件与概念有个了解. Kubernete ...