56. Merge Intervals && 57. Insert Interval

56. Merge Intervals

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].

 
Solution:
Wrap the interval into some sortable class and sort the collection. Then merge in order.
 
/**
 * 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<SortableInterval> wraps = new ArrayList<>();
    for (Interval interval : intervals) {
      wraps.add(new SortableInterval(interval));
    }
    Collections.sort(wraps);

    List<Interval> results = new ArrayList<>();
    if (wraps.isEmpty())
      return results;
    Interval merge = new Interval(wraps.get(0).interval.start, wraps.get(0).interval.end);
    for (int i = 1; i < wraps.size(); ++i) {
      SortableInterval current = wraps.get(i);
      if (current.interval.start <= merge.end) {
        merge.end = Math.max(current.interval.end, merge.end);
      } else {
        results.add(merge);
        merge = new Interval(current.interval.start, current.interval.end);
      }
    }
    results.add(merge);
    return results;
  }

  class SortableInterval implements Comparable<SortableInterval> {

    private Interval interval;

    public SortableInterval(Interval interval) {

      this.interval = interval;
    }

    @Override
    public int compareTo(SortableInterval other) {
      int d1 = interval.start - other.interval.start;
      if (d1 != 0)
        return d1;
      return interval.end - other.interval.end;
    }
  }
}

 

57. Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

 
/**
 * 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; }
 * }
 */
 
class Solution {
  public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
    List<Interval> result = new LinkedList<>();
    int i = 0;
    // add all the intervals ending before newInterval starts
    while (i < intervals.size() && intervals.get(i).end < newInterval.start)
      result.add(intervals.get(i++));

    // merge all overlapping intervals to one considering newInterval
    while (i < intervals.size() && intervals.get(i).start <= newInterval.end) {
      newInterval = new Interval(
        Math.min(newInterval.start, intervals.get(i).start),
        Math.max(newInterval.end, intervals.get(i).end));
      ++i;
    }
    result.add(newInterval);

    // add the rest
    while (i < intervals.size())
      result.add(intervals.get(i++));

    return result;
  }
}

 

 

 
posted @ 2016-08-26 13:24  新一代的天皇巨星  阅读(179)  评论(0编辑  收藏  举报