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
Given intervals
[1,3],[6,9]
, insert and merge [2,5]
in as [1,5],[6,9]
.
Example 2:
Given
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
Solution:
Below is a simple solution in Python:
[4,9]
overlaps with [3,5],[6,7],[8,10]
.Solution:
Below is a simple solution in Python:
- # Definition for an interval.
- # class Interval:
- # def __init__(self, s=0, e=0):
- # self.start = s
- # self.end = e
- class Solution:
- def insert(self, intervals, newInterval):
- l = []
- count = 0
- while(count < len(intervals)):
- if(newInterval.start <= intervals[count].end):
- if(newInterval.end >= intervals[count].start):
- newInterval.start = min(intervals[count].start, newInterval.start)
- break
- l.append(intervals[count])
- count += 1
- l.append(newInterval)
- while(count < len(intervals)):
- if(newInterval.end < intervals[count].start):
- break
- l[-1].end = max(intervals[count].end, l[-1].end)
- count += 1
- while(count < len(intervals)):
- l.append(intervals[count])
- count += 1
- return l
And here is a faster solution using binary search:
- class Solution:
- def insert(self, intervals, newInterval):
- if len(intervals) == 0:
- return [newInterval]
- v1 = self.search(intervals, newInterval.start,0, len(intervals)-1, 0)
- v2 = self.search(intervals, newInterval.end,(v1)>>1, len(intervals)-1, 1)
- if (v1 & 1):
- newInterval.start = intervals[v1>>1].start
- if (v2 & 1):
- newInterval.end = intervals[(v2)>>1].end
- return intervals[:(v1>>1)] + [newInterval] + intervals[(v2+1)>>1:]
- def search(self, intervals, index, start=0, end=0, isStart=0):
- while(start <= end):
- middle = (end+start)>>1
- if intervals[middle].start <= index and intervals[middle].end >= index:
- return (middle << 1)+1
- if intervals[middle].start > index:
- end = middle - 1
- else:
- start = middle + 1
- return start << 1
Third solution:
- class Solution:
- def insert(self, intervals, newInterval):
- s, e = newInterval.start, newInterval.end
- left = [i for i in intervals if i.end < s]
- right = [i for i in intervals if i.start > e]
- if left + right != intervals:
- s = min(s, intervals[len(left)].start)
- e = max(e, intervals[~len(right)].end)
- return left + [Interval(s, e)] + right
If you want to train the code reading skills, here is another approach in Java:
- /**
- * Definition for an interval.
- **/
- 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> insert(List<Interval> intervals, Interval newInterval){
- List<Interval> is = new ArrayList<Interval>();
- if(intervals == null || newInterval == null) return is;
- int status = 0;
- Interval open = null;
- for(Interval i: intervals){
- //if not found a interval containing the newInterval
- if(status==0){
- if(i.start > newInterval.end){
- is.add(newInterval);
- is.add(i);
- status = 2;
- }else if(i.end < newInterval.start){
- is.add(i);
- }else if(i.start<= newInterval.start && i.end < newInterval.end){
- open = new Interval(i.start, newInterval.end);
- status = 1;
- }else if(i.start > newInterval.start && i.end < newInterval.end){
- status = 1;
- open = new Interval(newInterval.start, newInterval.end);
- }else {
- is.add(new Interval(Math.min(newInterval.start, i.start), i.end));
- status = 2;
- }
- }else if(status == 1){
- if(i.start <= newInterval.end && i.end>= newInterval.end){
- status = 2;
- open.end = i.end;
- is.add(open);
- }else if(i.start > newInterval.end){
- status = 2;
- open.end = newInterval.end;
- is.add(open);
- is.add(i);
- }
- }else { //status = 2
- is.add(i);
- }
- }
- if(status == 0) is.add(newInterval);
- if(status == 1){
- open.end = newInterval.end;
- is.add(open);
- }
- return is;
- }
- }
No comments:
Post a Comment