示例:
输入: arr1=[[1, 3], [5, 6], [7, 9]], arr2=[[2, 3], [5, 7]]
返回: [2, 3], [5, 6], [7, 7]
输入: arr1=[[1, 3], [5, 7], [9, 12]], arr2=[[5, 10]]
返回: [5, 7], [9, 10]
思路:
2个区间的关系, 一共有四种可能,没有交集, 部分交集,被包含, 相等。
因为要求的是两个有序区间列表的交集, 使用 2个指针分别遍历一个区间列表,然后将求当前所指的区间的交集。直到任意一个遍历结束即可。
使用示例① 中的数据,演示执行步骤。
代码:
In [1]: def merge_interval(intervals1, intervals2):
...: ret = []
...: i, j = 0, 0
...:
...: while i < len(intervals1) and j < len(intervals2):
...: if intervals1[i][1] < intervals2[j][0]:
...: i += 1
...: elif intervals2[j][1] < intervals1[i][0]:
...: j += 1
...: else:
...: start = max(intervals1[i][0], intervals2[j][0])
...: end = min(intervals1[i][1], intervals2[j][1])
...: ret.append([start, end])
...: if intervals1[i][1] == end:
...: i += 1
...: if intervals2[j][1] == end:
...: j += 1
...: return ret
...:
In [2]: merge_interval([[1, 3], [5, 6], [7, 9]], [[2, 3], [5, 7]])
Out[2]: [[2, 3], [5, 6], [7, 7]]
In [3]: merge_interval([[1, 3], [5, 7], [9, 11]], [[5, 10]])
Out[3]: [[5, 7], [9, 10]]