32、给出一组区间,请合并所有重叠的区间

一、题目

给出一组区间,请合并所有重叠的区间。

请保证合并后的区间按区间起点升序排列

二、实现

对左边界排序,如果下一个区间的左边界在前一个的有边界内,考虑是否要更新边界,

如果如果下一个区间的左边界在前一个的有边界外,说明区间无法合并,开始计算下一个区间

首先我们来考虑一个问题:什么样的两个区间可以合并?
图片说明

像上图这样,起点大的那个区间([13,16])的起点在另一个区间的范围之内,这样两个区间就可以进行合并了

所以我们把全部的区间按起点进行排序,然后看一下第i个区间能不能和i-1个区间合并,如果能合并的话,就删掉第i-1个区间,然后把第i个区间变成这两个区间的合并

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
import java.util.*;
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<>(); //结果集
        //1. 首先对每个区间的起点进行排序(递增)
        Collections.sort(intervals, (a,b)-> a.start-b.start);
        
        int len = intervals.size();
        if(len == 0) return res; 
        
        //2. 遍历每一个区间。遍历过程中合并所有重合的区间
        for(int i=0;i<len;i++){
            int start = intervals.get(i).start;
            int end = intervals.get(i).end;
            // 将所有重叠的区间合并(即下一区间的开始点,在上一区间内)
            while(i<len-1 && intervals.get(i+1).start <= end){
                // 更新开始和结束点
                start = Math.min(start,intervals.get(i+1).start); //开始取最小
                end = Math.max(end,intervals.get(i+1).end);//结束取最大
                i++; //继续遍历下一个区间是否重叠
            }
            res.add(new Interval(start,end)); //将合并后的区间加入结果集
        }
        return res;
    }
}

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值