import java.util.*; /* * public class Interval { * int start; * int end; * public Interval(int start, int end) { * this.start = start; * this.end = end; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param intervals Interval类ArrayList * @return Interval类ArrayList */ public ArrayList<Interval> merge (ArrayList<Interval> intervals) { if (intervals.size() == 0) { return new ArrayList<Interval>(); } intervals.sort((a,b) -> { return a.start - b.start; }); // write code here ArrayList<Interval> mergeArray = new ArrayList<>(); mergeArray.add(intervals.get(0)); int last = 0; for (int i = 1; i < intervals.size();i++) { Interval inter = intervals.get(i); Interval mergeInter = mergeArray.get(last); if (mergeInter.end >= inter.start) { //合并 mergeInter.end = Math.max(mergeInter.end,inter.end); } else { mergeArray.add(inter); last++; } } return mergeArray; } }
1、按区间起点排序,然后就可合并相邻的区间(假如交叉),排序可保证所有可合并的区间都连续。
2、具体操作:若交叉,更新合并后数组最后一个区间的结尾end取mergeArray[last],intervals[i]最大的一个(相当于合并、插入mergeArray[last])。
若无交叉,则intervals[i]插入mergeArray结尾,last++。继续遍历intervals,重复2;
3、mergerArray初始为排序后的第一个区间;注意判断入参为空数组的情况。