56. 合并区间
题目-中等难度
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
- 1 <= intervals.length <= 104
- intervals[i].length == 2
- 0 <= starti <= endi <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 列表排序+新建列表重排
执行用时:336 ms, 在所有 Python3 提交中击败了5.44%的用户
内存消耗:19.2 MB, 在所有 Python3 提交中击败了57.89%的用户
通过测试用例:170 / 170
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
lin = len(intervals)
# 给列表排序
intervals.sort()
# 结果列表
res = []
# 当intervals列表中有残余项
while intervals:
# 添加到res中
res.append(intervals.pop(0))
# 对比下一项,如果可以重合,则进行重合,直到不可重合的项,进行下一次循环
while intervals and intervals[0][0] <= res[-1][1]:
res[-1] = [min(intervals[0][0],res[-1][0]),max(intervals[0][1],res[-1][1])]
intervals.pop(0)
return res
2. 原列表直接替换
执行用时:168 ms, 在所有 Python3 提交中击败了6.56%的用户
内存消耗:19 MB, 在所有 Python3 提交中击败了74.04%的用户
通过测试用例:170 / 170
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 排序
intervals.sort()
# 索引从1开始
i = 1
# 遍历
while i < len(intervals):
# (x1,y1)为(x2,y2)的前一项
x1,y1,x2,y2 = intervals[i-1][0],intervals[i-1][1],intervals[i][0],intervals[i][1]
# 如果x2不比y1大, 两种情况
if x2 <= y1:
# 如果y2也没y1大
if y2 <= y1:
intervals[i-1:i+1] = [[x1,y1]]
# 如果y2比y1大
else:
intervals[i-1:i+1] = [[x1,y2]]
# 由于合并了,所以索引要-1
i-=1
i+=1
return intervals