leetcode20: Insert Interval

来源:互联网 发布:商城数据库设计 编辑:程序博客网 时间:2024/06/04 17:42

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

java version. can not pass large test case.

/** * 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; } * } */ import java.util.ListIterator; public class Solution {    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {        // Start typing your Java solution below        // DO NOT write main() function        //ArrayList<Interval> res = new ArrayList<Inteval>();        int sz = intervals.size();                int low = newInterval.start;        int high = newInterval.end;                ListIterator<Interval> iter = intervals.listIterator();                while(iter.hasNext() ) {            Interval it =  iter.next();                        if(high<it.start) {                iter.previous();                iter.add( new Interval(low, high) );                return intervals;            }                                    if(low>it.end) {                continue;            } else {                low = Math.min(low, it.start);                high = Math.max(high, it.end);                iter.remove();            }                    }                intervals.add(new Interval(low, high) );        return intervals;    }}



/** * 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:    vector<Interval> insert(vector<Interval> &ints, Interval newInterval) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<Interval> intervals( ints);                        int low = newInterval.start;        int high = newInterval.end;                bool delFlag = false;                for(int i=0; i<intervals.size(); i++) {            if( intervals[i].start <= low && ( i==intervals.size()-1 || intervals[i+1].start > low ) {                if( intervals[i].end >= low) {                    newInterval.start = intervals[i].start;                    intervals.erase( intervals.begin() + i );                }                 delFlag = true;                    }                        if( delFlag) {                    intervals.erase( intervals.begin() + i);            }                        if( intervals[i].end >= high ) {                if( intervals[i].start <= high) {                    newInterval.end = intervals[i].end;                    intervals.erase( intervals.begin() + i);                }                delFlag = false;                                intervals.insert( newInterval, i-1);            }        }        return intervals;    }};

peking2's treemap solution.

class Solution1{    TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();    void insert(Interval interval)    {        Integer prev = tm.floorKey(interval.start);        Integer next = tm.ceilingKey(interval.start);        if (prev != null && tm.get(prev) >= interval.start || next != null                && interval.end >= next)        {            int start = -1;            if (prev != null && tm.get(prev) >= interval.start)            {                tm.put(prev, Math.max(tm.get(prev), interval.end));                start = prev;            }            else            {                int s = interval.start;                int e = Math.max(interval.end, tm.get(next));                tm.remove(next);                tm.put(s, e);                start = s;            }            while (tm.higherKey(start) != null                    && tm.get(start) >= tm.higherKey(start))            {                tm.put(start, Math.max(tm.get(start), tm.higherEntry(start)                        .getValue()));                tm.remove(tm.higherKey(start));            }        }        else            tm.put(interval.start, interval.end);    }

2nd c++ try:

class Solution {public:    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        // Start typing your C/C++ solution below        // DO NOT write int main() function    //Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].        //check input;        int sz = intervals.size();        vector<Interval> res;                for(int i=0; i<sz; i++) {            if(intervals[i].end < newInterval.start) {                res.push_back( intervals[i]);            } else if( intervals[i].start > newInterval.end) {                res.push_back( newInterval);                res.insert(res.end(), intervals.begin()+i, intervals.end() );                return res;            } else {                newInterval.start = min(newInterval.start, intervals[i].start);                newInterval.end = max(newInterval.end, intervals[i].end);            }        }        res.push_back(newInterval);         return res;    }