首页 > 其他分享 >LC56. 合并区间

LC56. 合并区间

时间:2023-05-30 21:35:01浏览次数:50  
标签:end 边界 int 合并 start LC56 intervals 区间

题目来源于力扣题库,题目链接:LC56.合并区间

Q:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  1 <= intervals.length <= 104
  intervals[i].length == 2
  0 <= starti <= endi <= 104

A:思路:

  第一步,排序。排序是为了使得相邻的区间尽可能的挨着,为了后续的左或右边界的比较,这里根据左边界或右边界进行排序都可,笔者这里按照左边界进行升序排序。   第二步,比较。将intervals[0]作为一个初始基准,从第二个开始比较,记start为待放入结果集的初始左边界,即start = intervals[0][0],同理待放入结果集的右边界为end = intervals[0][1];   接着,从intervals[i](i∈[1, intervals.length - 1])开始跟前一个区间进行比较,假设i = 1,也就是说intervals[1]和intervals[0]进行比较,观察一下两个区间[start, end] 和[intervals[1][0], intervals[1][1]],它们是排序后的,故一定有start < intervals[1][0],也就是说待放入结果集的左边界一定是确定的,也就是start;   那么如何待放入结果集的右边界呢?   由于end和intervals[1][0]的大小关系是不确定的,可大可小,所以此时就分为了两种情况:   若intervals[1][0] > end,表示不会出现重合区间,直接将[start, end]加入结果集即可,并更新下一次的start和end。   若intervals[1][0] < end,表示会出现重合,则更新end即可。   循环至终,也要记得将最后的[start, end]加入结果集。

  以下是Java代码,仅供参考:

 

package algo;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

class mergeSolution_56{
    public int[][] merge(int[][] intervals){

        if(intervals.length == 1) return intervals; // 如果题目给出的二维数组长度为1,则不需要合并,直接返回intervals

        Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0])); // 现将多个区间按照其左边界排序,这样可以简化问题

        List<int[]> res = new LinkedList<>();
        int start = intervals[0][0];
        int end = intervals[0][1];

        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0] > end){ // 不重合,说明该区间不需要与后面的区间进行比较了,即其为结果之一,加入结果集即可
                res.add(new int[]{start, end}); // 加入当前的 [start, end] 区间
                start = intervals[i][0]; // 更新start
                end = intervals[i][1]; // 更新end
            }else{
                end = Math.max(end, intervals[i][1]); // 重合,更新右边界
            }
        }
        res.add(new int[]{start, end});
        return res.toArray(new int[res.size()][]);
    }


    /* 测试 */
    public static void main(String[] args) {
        mergeSolution_56 solution_56 = new mergeSolution_56();
        int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
        int[][] answer = solution_56.merge(intervals);
        for (int[] is : answer) {
            System.out.println(Arrays.toString(is));
        }
    }
}

 

标签:end,边界,int,合并,start,LC56,intervals,区间
From: https://www.cnblogs.com/fxy0715/p/17444491.html

相关文章

  • 差分数组,经常在数组某段区间内统一进行加减相同值
    假设某一数组d经常做在某一段区间[a,b]内统一进行加减的操作,由于每次进行操作都需要从a循环遍历到b,时间开销较大,所以可以采用差分数组来解决此类问题.设数组d[]={8,1,3,6,5,4,2}当需要在区间[0,3]上统一加3时,不采用循环的方式,而是新创建一数组c,初始每个下标上的值均为0,则:......
  • Java中多个pdf合并为一个pdf文件工具类
    Java中多个pdf合并为一个pdf文件工具类方案一:引入依赖<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>工具类importcom.lowagie.text.Document;impo......
  • nyoj 304(区间dp)
    解题思路:这道题很明显是用区间dp,可是与以往的区间dp不同,因为对于区间[i,j],机器人所处的位置要么在i,要么在j(因为机器人要移动到某一点才能关闭灯泡,所以对于某一段区间来说,机器人最后肯定在两个端点上,否则将不能成立),那么既然要表示在左端点还是右端点,所以我们再开三维数组dp[i][j][0]......
  • hdu 3577(线段树区间更新)
    题意:输入一个t,表示有t组测试数据;         接下来一行,输入两个数,k,m,其中k表示这个辆车最多可以坐这么多人,m表示有m次询问能否上车;         每一次询问,输入两个数a,b,表示该乘客能否在a站台上车,b站台下车,乘车区间为(a,b--),先后次序;         即我每次询......
  • hihocoder #1078 : 线段树的区间修改
    解题思路:基础的线段树区间修改我按照书上敲的代码不知道为什么WA。。。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmaxn=1e5;intn,q,l,r,_sum;intsetv[maxn<<2],sum[maxn<<2];voidmaintain(into,intL,intR){ intl......
  • hdu 1698(线段树区间更新)
    解题思路:线段树区间更新水题。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmaxn=100005;structseg{ intl,r,sum,lazy;}tree[maxn<<2];voidbuild(intl,intr,intu){ tree[u].l=l; tree[u].r=r; t......
  • hdu 5367(线段树+区间合并)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367官方题解:对于求“高山脉”长度,可以利用线段树。树节点中保存左高度连续长度,左高度连续区间的高度,左高度连续区间的状态(即是否高于第一个高度不同的山),右高度连续长度,右高度连续区间的高度,右高度连续区间的状态,每段区间内的“......
  • LeetCode 617. 合并二叉树
    题目链接:LeetCode617.合并二叉树题意:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新......
  • 代码随想录算法训练营第二十天|654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树
    【参考链接】654.最大二叉树【注意】1.构造二叉树,都需要用前序遍历。2.二叉树的根是数组中的最大元素。3.没必要构造新数组,通过下标控制左右区间。运行效率会高很多。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init......
  • upc 6888: 守卫(区间dp O(n^2) )
    6888:守卫时间限制:1Sec  内存限制:512MB提交:102  解决:33[提交][状态][讨论版][命题人:admin]题目描述九条可怜是一个热爱运动的女孩子。这一天她去爬山,她的父亲为了她的安全,雇了一些保镖,让他们固定地呆在在山的某些位置,来实时监视九条可怜,从而保护她。具体来......