56. 合并区间

56. 合并区间

1. 题目描述
题目链接

给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

2. 题目分析
如果两个区间有重合的部分,则可以将两个区间进行合并。
合并时需要注意的一点是,如果两个区间,如[2,5],[3,4],两个区间是存在重合的部分,但合并时,不是简单的取第一个区间的start值,和第二区间的end值,合并成新的区间,即[2,4],这明显把两个区间能表示的范围缩小了。

3. 解决思路

  • 暴力方法:每次查找是否存在与当前区间有重合的区间,遍历整个集合,比较是否有符合条件的区间,时间复杂度为O(n2);
  • 高效率的方法:首先将这些乱序的集合进行排序,这里有人会问区间之间要怎么排序?这里涉及到java的高级的集合工具类,自己定义实现一个比较类IntervalComparator,只要实现Comparator接口就可以了。最后调用Collections.sort()(Collections说明这是对集合对象的工具类,如list、set等)方法进行区间排序。

4. 代码实现(java)

package com.algorithm.leetcode.array;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by 凌 on 2018/12/8.
 * 描述:合并区间
 */
public class MergeInterval {
    public static void main(String[] args) {
        List<Interval> list = new ArrayList<>();
        Interval interval = new Interval(1,3);
        list.add(interval);
        interval = new Interval(2,6);
        list.add(interval);
        interval = new Interval(15,18);
        list.add(interval);
        interval = new Interval(8,10);
        list.add(interval);
//        interval = new Interval(5,10);
//        list.add(interval);


        List<Interval> result = merge(list);
        for (int i = 0; i < result.size(); i++) {
            System.out.printf("["+result.get(i).start + "," + result.get(i).end + "],");
        }
        System.out.println("");
    }

    public static List<Interval> merge(List<Interval> intervals) {
        if (intervals == null || intervals.size() <= 1){
            return intervals;
        }
        List<Interval> list = new ArrayList<>();
        //对集合排序
        Collections.sort(intervals,new IntervalComparator());

        int beforeIndex= -1;
        for (Interval interval : intervals){
            if (list.isEmpty() || interval.start > list.get(beforeIndex).end){
                list.add(interval);
                beforeIndex++;
            }else{
                if (list.get(beforeIndex).end >= interval.start && list.get(beforeIndex).end < interval.start){
                    list.get(beforeIndex).end = interval.end;
                }

            }
        }

        return list;
    }

}
class Interval {
     int start;
     int end;
     Interval() { start = 0; end = 0; }
     Interval(int s, int e) { start = s; end = e; }
}

/**
 * 自己定义实现一个比较器
 */
class IntervalComparator implements Comparator<Interval> {

    @Override
    public int compare(Interval interval1,Interval interval2) {
        return interval1.start - interval2.start;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值