合并区间

// 输入: [[1,3],[2,6],[8,10],[15,18]]

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

/**
    * 思路:
    * 第一步,先按照start的大小将intervals排序。
    * 第二步,合并区间,先取出第一个区间,再取出紧挨着的区间,判断两个区间可以合并么,
    * 合并的条件是后一个区间的start要小于等于前一个区间的end,根据后一个区间的end值是否小于前一个区间的end值,
    * 确定合并后的区间,一直循环遍历完集合
 *
 */
public class TTT {


    public static void main(String[] args) {
        Interval i1 = new Interval(1, 3);
        Interval i2 = new Interval(2, 6);
        Interval i3 = new Interval(8, 10);
        Interval i4 = new Interval(15, 18);
        List<Interval> intervals =  new ArrayList<>();
        intervals.add(i1);
        intervals.add(i2);
        intervals.add(i3);
        intervals.add(i4);
        List<Interval> res = merge(intervals);
        System.out.println("#####");
    }
    
    public static List<Interval> merge(List<Interval> intervals) {
        //1.先按照start排序
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                return  o1.start - o2.start;
            }
        });
        List<Interval> res = new ArrayList<Interval>();
        int len = intervals.size();
        int pos = 0;
        while(pos <= len-1){
            int start = intervals.get(pos).start;
            int end = intervals.get(pos).end;
            int j = pos+1;
            //2.下一个元素可以合并就合并,不能合并就添加到res中并且跳到下一个元素
            while( j<= len-1 && intervals.get(j).start <= end){
                if(end < intervals.get(j).end){
                    end = intervals.get(j).end;
                }
                j++;
            }
            res.add(new Interval(start,end));
            pos = j;
        }
        return res;
    }
    
    static class Interval {
           int start;
           int end;
           Interval() { start = 0; end = 0; }
           Interval(int s, int e) { start = s; end = e; }
     }
}

 

posted @ 2019-06-21 16:45  踏月而来  阅读(363)  评论(0编辑  收藏  举报