leetcode每日一题_20260805
56.合并区间
日期:2026年8月5日
1.题目
以数组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] 可被视为重叠区间。示例 3:
输入:intervals = [[4,7],[1,4]] 输出:[[1,7]] 解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。提示:
1 <= intervals.length <= 104intervals[i].length == 20 <= starti <= endi <= 104
2.学习过程
**解法1:**排序求解
将列表中的区间按照左侧端点升序排序,排序规则为按照左端点从小到大排列,当左端点相同时的右端点从小到大排列
从第一个区间开始,依次考虑列表中后面每个区间:
- 对每个区间进行处理,如果当前区间的左端点在上次处理过的区间结果的右端点之后,那么不会重合,直接保留
- 否则,他们会重合,则用当前的区间右侧端点更新上次处理国的区间结果右端点
也就是说:对于排序后的区间来说,每前一个区间与后一个区间的判断标准是:当前一个区间的右侧端点,例如(3, 4)中的4,小于当前区间的左侧端点,例如(6, 8)中的6,时,则一定无法重合;否则当前一个区间的右侧端点,例如(3, 4)中的4,不小于当前区间的左侧端点,例如(4, 5)中的4,则可以重合,此时就需要将前一个区间的右侧端点重置为当前区间的右侧端点与前一区间右侧端点中的最大值,总结就是根据排序后的左侧端点判断是否可以合并,根据右侧端点来执行合并重置
所以:
若有数组:[(1, 9), (2, 5), (19, 20), (10, 11), (12, 20), (0, 3), (0, 1), (0, 2), (1, 3)]
则排序后应为:[(0, 1), (0, 2), (0, 3), (1, 3), (1, 9), (2, 5), (10, 11), (12, 20), (19, 20)]
使用merged存储结果列表
循环排序后的数组,每个区间进行单独处理
当指针指向第1个区间:即(0, 1),merged为空,则直接添加,merged:[(0, 1)]
当指针指向第2个区间:即(0, 2),已添加的区间是(0, 1),其右端点数字是1,1不小于当前区间左侧端点(0),则需要与上一个已经添加的端点进行合并,所以取1和2中的最大值2,修改上一个已经添加的区间右侧端点为2,则,merged:[(0, 2)]
当指针指向第3个区间:即(0, 3),已添加的区间是(0, 2),其右端点数字是2,2不小于当前区间左侧端点(0),则需要与上一个已经添加的端点进行合并,所以取2和3中的最大值3,修改上一个已经添加的区间右侧端点为3,则,merged:[(0, 3)]
当指针指向第4个区间:即(1, 3),已添加的区间是(0, 3),其右端点数字是3,3不小于当前区间左侧端点(1),则需要与上一个已经添加的端点进行合并,所以取3和3中的最大值3,修改上一个已经添加的区间右侧端点为3,则,merged:[(0, 3)]
当指针指向第5个区间:即(1, 9),已添加的区间是(0, 3),其右端点数字是3,3不小于当前区间左侧端点(1),则需要与上一个已经添加的端点进行合并,所以取9和3中的最大值9,修改上一个已经添加的区间右侧端点为9,则,merged:[(0, 9)]
当指针指向第6个区间:即(2, 5),已添加的区间是(0, 9),其右端点数字是9,9不小于当前区间左侧端点(2),则需要与上一个已经添加的端点进行合并,所以取9和5中的最大值9,修改上一个已经添加的区间右侧端点为9,则,merged:[(0, 9)]
当指针指向第7个区间:即(10, 11),已添加的区间是(0, 9),其右端点数字是9,9小于当前区间左侧端点(10),则直接添加,merged:[(0, 9), (10, 11)]
当指针指向第8个区间:即(12, 20),已添加的区间是(10, 11),其右端点数字是11,11小于当前区间左侧端点(12),则直接添加,
merged:[(0, 9), (10, 11), (12, 20)]
当指针指向第9个区间:即(19, 20),已添加的区间是(12, 20),其右端点数字是20,20不小于当前区间左侧端点(19),则需要与上一个已经添加的端点进行合并,所以取20和20中的最大值20,修改上一个已经添加的区间右侧端点为9,则,merged:[(0, 9), (10, 11), (12, 20)]
classSolution:defmerge(self,intervals:List[List[int]])->List[List[int]]:intervals.sort()merged=[]forintervalinintervals:ifnotmergedormerged[-1][1]<interval[0]:merged.append(interval)else:merged[-1][1]=max(merged[-1][1],interval[1])returnmerged**解法1:**排序+双指针
这个解法有时间再学习一下