-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path057 Insert Interval.py
executable file
·82 lines (63 loc) · 2.22 KB
/
057 Insert Interval.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"""
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].
"""
__author__ = 'Danyang'
# Definition for an interval.
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
def __str__(self):
return "[%d, %d]" % (self.start, self.end)
def __repr__(self):
return repr(self.__str__())
class Solution(object):
def insert(self, itvls, newItvl):
s, e = newItvl.start, newItvl.end
left = filter(lambda x: x.end < s, itvls)
right = filter(lambda x: x.start > e, itvls)
if len(left)+len(right) != len(itvls):
s = min(s, itvls[len(left)].start)
e = max(e, itvls[-len(right)-1].end)
return left + [Interval(s, e)] + right
def insert_itr(self, itvls, newItvl):
"""
iterator TODO
"""
class SolutionSlow(object):
def insert(self, itvls, newItvl):
"""
:param itvls: a list of Intervals
:param newItvl: a Interval
:return: a list of Interval
"""
return self.merge(itvls+[newItvl])
def merge(self, itvls):
"""
sort first by .start
then decide whether to extend the .end
:param itvls: list of Interval
:return: list of Interval
"""
itvls.sort(cmp=lambda a, b: a.start - b.start)
ret = [itvls[0]]
for cur in itvls[1:]:
pre = ret[-1]
if cur.start <= pre.end: # overlap
pre.end = max(pre.end, cur.end)
else:
ret.append(cur)
return ret
if __name__ == "__main__":
lst = [[1, 2], [3, 5], [6, 7], [8, 10], [12, 16]]
insert = [4, 9]
lst_interval = []
for item in lst:
lst_interval.append(Interval(item[0], item[1]))
print Solution().insert(lst_interval, Interval(insert[0], insert[1]))