href="http://ounix1xcw.bkt.clouddn.com/github.markdown.css" rel="stylesheet">
这是leetcode的第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]
.
思路 理清思路,显然只有4种情况,即newintreval的start
,end
分别在原来的区间(cross)、 不在原来区间(即在两区间之间),当然,新区间中可能含有若干原来的区间。分类后,为了使原来的第一个和最后一个,与其他区间有同等“地位”,即可以使用同样的代码,我将intervals首尾插入了两个很大的区间。
show me the code
# class Interval(object): # def __init__(self, s=0, e=0): # self.start = s # self.end = e class Solution(object): def insert(self, intervals, newInterval): """ :type intervals: List[Interval] :type newInterval: Interval :rtype: List[Interval] """ MAX=100000000 first=Interval() first.start=first.end=-MAX last=Interval last.start=last.end=MAX intervals.insert(0,first) intervals.append(last) l = len(intervals) for i in range(l): if intervals[i].start>newInterval.start : j = i isCross = False while intervals[j].start<=newInterval.end: if intervals[j].end<newInterval.end: del intervals[j] else: isCross = True break if isCross: intervals[j].start=newInterval.start else:intervals.insert(j,newInterval) break else : if intervals[i].end >= newInterval.start: if intervals[i].end >= newInterval.end:break j = i 1 isCross = False while intervals[j].start<=newInterval.end: if intervals[j].end<newInterval.end : del intervals[j] else: isCross = True break if isCross: intervals[j].start=intervals[i].start del intervals[i] else:intervals[i].end = newInterval.end break del intervals[0] del intervals[-1] return intervals