標籤:
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
解題思路一:
用兩個指標startIndex和endIndex來維護每次添加intervals的start和end的位置,然後分類討論即可,JAVA實現如下:
public List<Interval> merge(List<Interval> intervals) { List<Interval> list = new ArrayList<Interval>();if (intervals.size() == 0)return list;list.add(intervals.get(0));for (int i = 1; i < intervals.size(); i++) {Interval temp = intervals.get(i);int startIndex = 0, endIndex = 0;for (int j = 0; j < list.size(); j++) {if (temp.start > list.get(j).end) {startIndex += 2;endIndex += 2;continue;}if (temp.end < list.get(j).start)break;if (temp.start >= list.get(j).start)startIndex++;if (temp.end > list.get(j).end) {endIndex += 2;continue;}if (temp.end >= list.get(j).start)endIndex++;break;}if(startIndex==endIndex&&startIndex%2==0)list.add(startIndex/2,new Interval(temp.start,temp.end));else if(startIndex%2==0&&endIndex%2==0){list.get(startIndex/2).start=temp.start;list.get(startIndex/2).end=temp.end;for(int k=1;k<endIndex/2-startIndex/2;k++)list.remove(startIndex/2+1);}else if(startIndex%2==0&&endIndex%2!=0){list.get(startIndex/2).start=temp.start;list.get(startIndex/2).end=list.get(endIndex/2).end;for(int k=1;k<=endIndex/2-startIndex/2;k++)list.remove(startIndex/2+1);}else if(startIndex%2!=0&&endIndex%2==0){list.get(startIndex/2).end=temp.end;for(int k=1;k<endIndex/2-startIndex/2;k++)list.remove(startIndex/2+1);}else if(startIndex%2!=0&&endIndex%2!=0){list.get(startIndex/2).end=list.get(endIndex/2).end;for(int k=1;k<=endIndex/2-startIndex/2;k++)list.remove(startIndex/2+1);}}return list;}
解題思路二:
首先構造一個比較子,對interval按照start進行排序,然後進行遍曆,在遍曆過程中,如果結果集合為空白或者當前interval與結果集合中的最後一個interval不重疊,那麼就直接將當前interval直接加入到結果集合中;如果發生了重疊,那麼將結果集合的最後一個interval的右端點改為當前interval的右端點,JAVA實現如下:
public List<Interval> merge(List<Interval> intervals) { List<Interval> list = new ArrayList<Interval>(); Comparator<Interval> comparator = new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { if (o1.start == o2.start) return o1.end - o2.end; return o1.start - o2.start; } }; Collections.sort(intervals, comparator); for (Interval interval : intervals) if (list.size() == 0 || list.get(list.size() - 1).end < interval.start) list.add(new Interval(interval.start, interval.end)); else list.get(list.size() - 1).end = Math.max(interval.end, list.get(list.size() - 1).end); return list; }
Java for LeetCode 056 Merge Intervals