您的位置:首页 > 其它

36.leetCode 57:Insert Interval(插入区间)

2018-01-20 07:07 387 查看
【题目】:

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

【思路】:

1. 和上一题的思路一样,先把新区间插入到列表中,使得列表仍为有序的。再遍历列表,逐一进行区间的合并

2.遍历一次列表,若列表中的当前元素与新区间没有重叠则直接插入到结果集中,否则要先与新区间进行合并,直到没有重叠为止

【Python代码】:

1.排序、合并

class Solution:
def insert(self, intervals, newInterval):
"""
:type intervals: List[Interval]
:type newInterval: Interval
:rtype: List[Interval]
"""
if not intervals:
return [newInterval]

merged = []
if len(intervals) == 1:
if newInterval.start >= intervals[0].start:
intervals.append(newInterval)
else:
intervals.insert(0, newInterval)
elif newInterval.start >= intervals[-1].start:
intervals.append(newInterval)
elif newInterval.start <= intervals[0].start:
intervals.insert(0, newInterval)
else:
for i in range(len(intervals) - 1):
if newInterval.start >= intervals[i].start and newInterval.start <= intervals[i + 1].start:
intervals.insert(i + 1, newInterval)
break

for interval in intervals:
if not merged or merged[-1].end < interval.start:
merged.append(interval)
else:
merged[-1].end = max(merged[-1].end, interval.end)

return merged

2.遍历、合并

class Solution:
def insert(self, intervals, newInterval):
"""
:type intervals: List[Interval]
:type newInterval: Interval
:rtype: List[Interval]
"""
if not intervals:
return [newInterval]

merged = []
for interval in intervals:
if newInterval is None or interval.end < newInterval.start:
merged.append(interval)
if len(intervals) == 1:
merged.append(newInterval)

elif interval.start > newInterval.end:
merged.append(newInterval)
merged.append(interval)
newInterval = None

else:
newInterval.start = min(interval.start,newInterval.start)
newInterval.end = max(interval.end,newInterval.end)
if newInterval and newInterval not in merged:
merged.append(newInterval)
return merged
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: