LeetCode56-合并区间
昨天晚上老周在初中同学群里大手一挥
发了一条消息
顿时群里炸开了锅
老周的文采依旧没减
瞬间带回了初中老周给我们批改日记的岁月
时间,这操蛋的玩意儿!
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
这一题的思路其实也是很简单:
- 先把给定大区间里面的小区间里第一个数字按从小到大顺序排序得到一个新的大区间
- 得到新的大区间后,就可以将里面的小区间从左到右依次合并了。符合要求的就可以合并,不符合要求的直接单独成一区间。
大致过程如下图所示,方便大家理解:
代码如下:
class Solution:
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
intervals_to_list = []
if len(interval_list) == 0:
return intervals_to_list
# 首先将intervals链表数组中链表的值转换成数组里的值,方便后续操作
for index in intervals:
interval = [index.start, index.end]
intervals_to_list.append(interval)
# 将intervals_to_list数组按照对应intervals中每一个链表对应的start值的大小重新排列,方便后续合并区间
intervals_to_list.sort()
if len(intervals_to_list) == 0:
return []
start, end = intervals_to_list[0]
final_list = []
# 这一步就是主要的合并区间过程了
for index in intervals_to_list:
if start <= index[0] <= end:
start = min(start, index[0])
end = max(end, index[1])
else:
final_list.append([start, end])
start, end = index
final_list.append([start, end])
final_intervals = []
# 得到合并之后的数组之后,还得将其转换成链表格式表示
for indice in final_list:
interval = Interval()
interval.start = indice[0]
interval.end = indice[1]
final_intervals.append(interval)
return final_intervals
if __name__ == "__main__":
interval_list = []
merge_list = [[-1, 5], [8, 14], [3, 5]]
for index in merge_list:
interval = Interval()
interval.start = index[0]
interval.end = index[1]
interval_list.append(interval)
final_list = Solution().merge(interval_list)
print(final_list)
执行效率在70%左右。