每天坚持刷题!!!
leetcode 56 合并区间
题目描述:
给出一个区间的集合,请合并所有重叠的区间。
题目分析:
1. 先简单分析下合并的过程。假设Interval_x 和 Interval_y合并,那么合并的结果就是 Interval(min(Interval_x.start, Interval_y.start), max(Interval_x.end, Interval_y.end))
2. 这道题的难点在于可能会有多个区间合并成一个区间,并且这些区间的位置并不连续。为了回避这个问题,我们可以先把给定的区间集合根据其起点来进行排序,不断从头尝试合并区间,直到下一个元素的起点比之前的区间(或是合并后的区间)的终点还要大就认为之前的合并过程结束,开始下一个区间的合并,直到最后一个区间。
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
if not intervals:
return []
if len(intervals) == 1:
return [[intervals[0].start, intervals[0].end]]
intervals = sorted(intervals, key=lambda x: x.start, reverse=False)
result = []
temp_start, temp_end = None, None
for i in xrange(len(intervals)):
if temp_start is None:
temp_start = intervals[i].start
temp_end = intervals[i].end
if intervals[i].start > temp_end:
result.append(Interval(temp_start, temp_end))
temp_start = intervals[i].start
temp_end = intervals[i].end
else:
temp_start = min(temp_start, intervals[i].start)
temp_end = max(temp_end, intervals[i].end)
if temp_start is not None:
result.append(Interval(temp_start, temp_end))
return result
leetcode 57 插入区间
这道题跟56实在是太像了,就一起解决了
题目描述:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
题目分析:
1. 这道题给出的区间集合就已经按照起点排好序了,good,省了一行代码
2. 所谓的插入可以简单的看成增加一个额外的区间后在进行合并,所以这里偷懒直接使用56的代码。当然为了效率可以使用二分查找找到对应的插入位置(因为已经按照起点排好序了),然后在对后面的元素进行合并操作直到无法合并即可。
def insert(self, intervals, newInterval):
"""
:type intervals: List[Interval]
:type newInterval: Interval
:rtype: List[Interval]
"""
if not intervals and not newInterval:
return []
elif not intervals:
return [newInterval]
elif not newInterval:
return intervals
intervals.append(newInterval)
intervals = sorted(intervals, key=lambda x: x.start, reverse=False)
result = []
temp_start, temp_end = None, None
for i in xrange(len(intervals)):
if temp_start is None:
temp_start = intervals[i].start
temp_end = intervals[i].end
if intervals[i].start > temp_end:
result.append(Interval(temp_start, temp_end))
temp_start = intervals[i].start
temp_end = intervals[i].end
else:
temp_start = min(temp_start, intervals[i].start)
temp_end = max(temp_end, intervals[i].end)
if temp_start is not None:
result.append(Interval(temp_start, temp_end))
return result