力扣56题:合并区间题解

6 阅读3分钟

Snipaste_2026-04-21_17-16-47.png

思路:

  • 通过观察不难发现,两个区间只有3种关系:第一种就是区间i完全包含区间j,比如[1,6][2,4];第二种就是区间i和区间j没有一点交集,就像例1中的[8,10][15,18];第三种就是区间i包含了区间j的部分,也就是说区间i和区间j是有交集的,但并非纯粹包含关系。而对于可以合并的,也就是我们题目需要处理的就是这个第一种和第三种关系

  • 对于这两种关系,这里我们从左面合并集合,那么这种关系需要满足种种关系,条件一就是集合i的前端要小于等于集合j的前端;条件二就是集合i的后端要大于集合j的前端;然后两个集合的后端之间的关系就可以用来区分是第一种关系还是第三种关系,具体可见下图

情况一:

1.png

情况二:

2.png

情况三:

3png

  • 所以这道题其实很简单,先把二维数组按照第一个元素(左端点)排个序,这样就能够保证在从左到右合并区间时右边的集合不会出现在左边集合的左边,当然,如果你从右往左遍历,就可以用第二个元素(右端点)来排序,之后就可以创建一个list来储存需要返回的区间,因为在过程中是要多次合并区间进行修改的,所以选择list来存储
  • 现在开始正式进入循环,一个一个集合来进行处理,如果此时还没有集合进入list中,就先把第一个集合存入list中,然后开始判断是哪种情况,从list中取出最后端的集合,用这个集合的右端来和当前遍历到的集合的左端进行对比,如果是大于关系,那么它就属于情况一或者情况三,就需要我们处理。无论是情况一还是情况三,我们都只需要让两个集合中最大的右端来当更新的集合的右端
  • 而对于小于关系,就是情况二,我们不做处理,直接加入到list中,并且下一次更新list中的集合就是更新它,原因就是因为我们对整个数组按照左端排序,既然属于情况二,那么很显然,对于刚才list中有的集合而言,后续的许哦有集合都和他没有任何交集,都属于情况二,所以才需要使用新加入list的集合来进行下一次更新

4.png

5.png

6.png

7.png

  • 以上就是算法的过程
  • 最后把list变成二维数组返回就好。

代码

  • 最后附上完整代码:
class Solution {
    public int[][] merge(int[][] intervals) {
          Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);
          List<int[]> res=new ArrayList<>();
          for(int i=0;i<intervals.length;i++){
                int size=res.size();
                if(size>0&&res.get(size-1)[1]>=intervals[i][0]){
                   res.get(size-1)[1]=Math.max(res.get(size-1)[1],intervals[i][1]);
                }else{
                    res.add(intervals[i]);
                }
          }

         int[][] arr = res.toArray(new int[0][]); 

         return arr;
    }
}
创作不易,还望多多支持,这里是一个大学生的力扣题解,谢谢大家观看,若有不足之处还望指出

.jpg