LeetCode-56. Merge Intervals

来源:互联网 发布:25岁衣服品牌知乎 编辑:程序博客网 时间:2024/05/18 15:57

一、问题描述

  1. 给定一系列区间,将其中重叠的区间合并,返回新的区间数组。
  2. 例如: 输入[1,3],[2,6],[8,10],[15,18]
    输出:[1,6],[8,10],[15,18]

二、解题思路

  1. 首先将给定的集合排序,排序的规则:
    • 按照集合中元素的start属性升序排列;
    • start属性相等的两个元素,按照end属性升序排列
  2. 然后遍历集合,首先为start变量赋值为集合中第一个元素的start属性,end变量赋值为集合中第一个元素的end属性;然后从第二个元素开始循环判断该元素的start属性是否大于end变量,如果是,则将前面的start变量和end变量添加到结果集中,同时更新start变量和end变量为当前元素的相应属性值;如果否,说明有重叠,然后选择end变量和end属性中较大值作为新的end变量。

三、代码

/** * 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; } * } */public class Solution {    public List<Interval> merge(List<Interval> intervals) {        List<Interval> result=new ArrayList<Interval>();       int n=intervals.size();        if(intervals==null || n==0)            return result;        Collections.sort(intervals,new Comparator<Interval>(){            @Override            public int compare(Interval A,Interval B){                /*                if(A.start!=B.start)                    return A.start-B.start;                return A.end-B.end;                */                //很奇怪的一件事,为什么比较函数换成上面的注释部分就超时呢                if(A.start>B.start){                    return 1;                }else if(A.start==B.start){                    if(A.end>B.end)                        return 1;                    else if(A.end==B.end)                        return 0;                    else                        return -1;                }else{                    return -1;                }            }        });         int start=intervals.get(0).start;         int end=intervals.get(0).end;        for(int i=1;i<intervals.size();i++){            if(intervals.get(i).start>end){                result.add(new Interval(start,end));                start=intervals.get(i).start;                end=intervals.get(i).end;            }else{                end=(intervals.get(i).end>=end)?intervals.get(i).end:end;            }        }        //end=(intervals.get(n-1).end>=end?intervals.get(n-1).end:end);        result.add(new Interval(start,end));        return result;    }}
原创粉丝点击