
leetcode每日一题_2026080556.合并区间日期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 1042.学习过程**解法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)其右端点数字是11不小于当前区间左侧端点0则需要与上一个已经添加的端点进行合并所以取1和2中的最大值2修改上一个已经添加的区间右侧端点为2则merged[(0, 2)]当指针指向第3个区间即(0, 3)已添加的区间是(0, 2)其右端点数字是22不小于当前区间左侧端点0则需要与上一个已经添加的端点进行合并所以取2和3中的最大值3修改上一个已经添加的区间右侧端点为3则merged[(0, 3)]当指针指向第4个区间即(1, 3)已添加的区间是(0, 3)其右端点数字是33不小于当前区间左侧端点1则需要与上一个已经添加的端点进行合并所以取3和3中的最大值3修改上一个已经添加的区间右侧端点为3则merged[(0, 3)]当指针指向第5个区间即(1, 9)已添加的区间是(0, 3)其右端点数字是33不小于当前区间左侧端点1则需要与上一个已经添加的端点进行合并所以取9和3中的最大值9修改上一个已经添加的区间右侧端点为9则merged[(0, 9)]当指针指向第6个区间即(2, 5)已添加的区间是(0, 9)其右端点数字是99不小于当前区间左侧端点2则需要与上一个已经添加的端点进行合并所以取9和5中的最大值9修改上一个已经添加的区间右侧端点为9则merged[(0, 9)]当指针指向第7个区间即(10, 11)已添加的区间是(0, 9)其右端点数字是99小于当前区间左侧端点10则直接添加merged[(0, 9), (10, 11)]当指针指向第8个区间即(12, 20)已添加的区间是(10, 11)其右端点数字是1111小于当前区间左侧端点12则直接添加merged[(0, 9), (10, 11), (12, 20)]当指针指向第9个区间即(19, 20)已添加的区间是(12, 20)其右端点数字是2020不小于当前区间左侧端点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**排序双指针这个解法有时间再学习一下