leetcode Question 35: Insert Interval


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

Analysis:


In other words, the questions gives a new interval, the task is to insert this new interval into an ordered non-overlapping intervals. Consider the merge case.
Idea to solve this problem is quite straight forward:
1. Insert the new interval according to the start value.
2. Scan the whole intervals, merge two intervals if necessary.



Code(C++):

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:

    bool myfunc(Interval a, Interval b) {
        return( a.start<b.start);
    }
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<Interval> res;
        vector<Interval>::iterator it;  
        for (it = intervals.begin();it!=intervals.end();it++){
            if (newInterval.start<(*it).start){
                intervals.insert(it,newInterval);
                break;
            }
        }    
        if (it==intervals.end()){intervals.insert(it,newInterval);}
        
        
        if (intervals.empty()) {return res;}
          
        res.push_back(*intervals.begin());
        for (it = intervals.begin()+1;it!=intervals.end();it++){
            if ((*it).start>res.back().end){res.push_back(*it);}
            else{ res.back().end = max(res.back().end,(*it).end);}
        }
        return res;
    }
};



Code(Python):

# Definition for an interval.
# class Interval:
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution:
    # @param intervals, a list of Intervals
    # @param newInterval, a Interval
    # @return a list of Interval
    def insert(self, intervals, newInterval):
        res = []
        if len(intervals) == 0:
            res.append(newInterval)
            return res
        # insert the new interval    
        intervals.append(newInterval)
        # sort list according to the start value    
        intervals.sort(key=lambda x:x.start)
        
        res.append(intervals[0])
        #scan the list
        for i in xrange(1,len(intervals)):
            cur = intervals[i]
            pre = res[-1]
            #check if current interval intersects with previous one
            if cur.start <= pre.end:
                res[-1].end = max(pre.end, cur.end) #merge
            else:
                res.append(cur) #insert
                
        return res
        
        

4 comments:

  1. Replies
    1. This comment has been removed by the author.

      Delete
  2. I have another solution:

    class Solution:

    def insert(self, intervals, newInterval):
    if len(intervals) == 0:
    return [newInterval]

    v1 = self.search(intervals, newInterval.start, 0)
    v2 = self.search(intervals, newInterval.end, 1)

    l = []
    if( v1 > 1):
    for i in range(v1>>1):
    l.append(intervals[i])

    if v1 & 1 == 1:
    newInterval.start = min(intervals[v1>>1].start, newInterval.start)
    if v2 & 1 == 1:
    newInterval.end = max(intervals[(v2)>>1].end, newInterval.end)

    l.append(newInterval)

    if v2 < (len(intervals)<<1 ) :
    for i in range((v2+1)>>1, len(intervals)):
    l.append(intervals[i])

    return l

    def search(self, intervals, index, isStart):
    start = 0
    end = len(intervals)-1
    while(start <= end):
    middle = ((end-start)>>1) + start
    if intervals[middle].start <= index and intervals[middle].end >= index:
    return (middle << 1)+1
    if intervals[middle].start > index:
    end = middle - 1
    if intervals[middle].end < index:
    start = middle + 1
    return start << 1

    url: http://traceformula.blogspot.com/2015/06/leetcode-insert-interval.html

    ReplyDelete