问题描述
给出一个区间的集合,请合并所有重叠的区间。
问题链接地址
链接: https://leetcode-cn.com/problems/merge-intervals/.
示例
示例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] 可被视为重叠区间。
问题标签
数组,排序
解题思路—栈
利用栈的思想,首先构建一个栈包含第一组元素,然后遍历其余数组,如果该元素的左侧不大于栈的最后一个元素,再将该元素的右侧进行比较,如果还是不大于最后一个元素,说明栈的后两个数字构成的区间包含这个区间,如果右侧大于栈的最后一个元素,则出栈,将该元素进栈。如果遍历元素的左侧直接大于栈的最后一个元素,说明与前一个区间并无交集,则可以直接进栈。
作者:he-fang-yuan
链接:https://leetcode-cn.com/problems/merge-intervals/solution/he-bing-qu-jian-by-he-fang-yuan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals) == 0:
return []
intervals.sort()
stack = [intervals[0][0],intervals[0][1]]
for i in range(1,len(intervals)):
if intervals[i][0] <= stack[-1]:
if intervals[i][1] <= stack[-1]:
continue
else:
stack.pop()
stack.append(intervals[i][1])
else:
stack.append(intervals[i][0])
stack.append(intervals[i][1])
T = []
for i in range(0,len(stack),2):
T.append([stack[i],stack[i+1]])
return T