本题leetcode 地址:https://leetcode-cn.com/problems/merge-intervals/
组合子区间,将重合的区间进行最大的组合,得到没有重合的区间
例如
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
核心思想是
1. 根据所有区间的开始位置进行排序
2. 如果当前区间的开始比上一个区间的结束小,则进行合并
3. 不断重复2
4. 添加最后一个区间
python代码实现
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if intervals is None or len(intervals) < 2:
return intervals
sorted_intervals = sorted(intervals, key=lambda x: x[0])
rst = []
new_add_arr = None
for i in range(1, len(sorted_intervals), 1):
if new_add_arr is None:
last = sorted_intervals[i - 1]
else:
last = new_add_arr
curr = sorted_intervals[i]
if curr[0] <= last[1]:
curr[0] = last[0]
curr[1] = max(curr[1], last[1])
new_add_arr = curr
else:
rst.append(last)
new_add_arr = None
if new_add_arr is not None:
rst.append(new_add_arr)
else:
rst.append(sorted_intervals[-1])
return rst
测试:
if __name__ == '__main__':
intervals= [[1, 3], [2, 6], [8, 10], [13, 15], [9, 14], [14, 25]]
# intervals = [[1, 4], [4, 5]]
rst = merge_sub_arrs(intervals)
print(rst)
输出:
[[1, 6], [8, 25]]