leetcode: Merge Intervals

来源:互联网 发布:linux三个启动命令 编辑:程序博客网 时间:2024/05/29 02:29

思路很简单,首先对输入list排序,使其内数据按照start的大小从小到大排列。  此时当一个区间能够插入的时候,该区间的start肯定要小于当前区间的end,否则该区间和该区间之后的区间都不可插入(因为按照start上升排列),故当前区间可以插入结果列表。    利用这一思想动态更新当前区间并判断插入即可。   需要注意的是

1. Java 要对ArrayList排序,利用Collection.sort()方法,还需要重写Comparator类的compare(Object o1,Object o2)方法;而c++只需重写sort的cmp方法即可

2. 向结果的ArrayList插入Interval时要插入一个新生成的对象,否则对插入对象的修改也会直接改变结果列表中插入的结果的值(ArrayList常插入int会忽视这点)


/** * 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 ArrayList<Interval> merge(ArrayList<Interval> intervals) {        ArrayList<Interval> res = new ArrayList<Interval>();        if( intervals == null || intervals.size()==0 )        {            return res;        }        Interval tmp = new Interval(-1,-1);        Collections.sort(intervals, new Comparator() {             @Override             public int compare(Object o1, Object o2) {                return ((Interval)o1).start-((Interval)o2).start;             }        });        for( Interval it : intervals )        {           if( tmp.start==-1 && tmp.end==-1 )           {               tmp.start = it.start;               tmp.end = it.end;           }           else           {               if( it.start > tmp.end )               {                   res.add(new Interval(tmp.start,tmp.end));                   tmp.start = it.start;                   tmp.end = it.end;               }               else               {                   tmp.start = Math.min(tmp.start,it.start);                   tmp.end = Math.max(tmp.end,it.end);               }           }        }        res.add(tmp);        return res;    }}


0 0