Friday, May 15, 2015

[Uber] Merge overlapping Interval

Problem: Given a set of intervals, not necessarily in sorted order, merge all overlapping intervals into one.

Example:

Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Approach:
  1. Sort all intervals according to their start time, if start time is same then based on end time.
  2. If current interval's start is lees than or equal to previous interval's end then we know that we can merge intervals. The new interval will be [previous interval' start, Max of current and previous end]. 
  3. Else add the current interval to result.
  4. Repeat 2-3 for every interval.

Implementation in C#:


       public int[][] Merge(int[][] intervals)
    {
        int length = intervals?.Length ?? 0;
        if (length <= 1)
        {
            return intervals;
        }
        Array.Sort(intervals, (i1, i2) => {
            int comp1 = i1[0].CompareTo(i2[0]);
            if (comp1 == 0)
            {
                return i1[1].CompareTo(i2[1]);
            }
            return comp1;
        });
        int writeIndex = 0;
        for (int i = 1; i < length; ++i)
        {
            if (intervals[i][0] <= intervals[writeIndex][1])
            {
                intervals[writeIndex][1] = Math.Max(intervals[i][1],
                                                intervals[writeIndex][1]);
            }
            else
            {
                intervals[++writeIndex] = intervals[i];
            }
        }
        List<int[]> result = new List<int[]>();
        for (int i = 0; i <= writeIndex; ++i)
        {
            result.Add(intervals[i]);
        };
        return result.ToArray();
    }


Complexity: O(nlogn)

No comments:

Post a Comment