最大重叠子区间
给出n个区间,找出重叠子区间的最大数量
例:
输入
1 4
1 2
2 3
3 4
输出
2
解释,最大重叠子区间出现在[1,2],重叠了2次,其他区间都重复了1次
也可以将本题理解为需要的最少会议室数,区间代表会议的开始时间和结束时间.
解法一
思路:
- 初始化一个数组
times[]
,长度尽可能大,最好为最大的区间右端点 - 遍历所有区间
[start, end]
,令times[start] += 1, times[end] -=1
,意义为,在start
位置增加了一个区间,在end
位置减少了一个区间 - 然后从前往后累加
times
数组,此时times
数组的含义就是在位置i
处的区间个数 - 求出
times
数组元素的最大值即可
看代码
def min_rooms(nums):
times = [0] * 1000
for i in range(len(nums)):
times[nums[i][0]] += 1
times[nums[i][1]] -= 1
for i in range(1, len(times)):
times[i] += times[i - 1]
print(max(times))
解法二
思路:
利用最小堆,存储区间右端点(存储会议结束时间)
- 先将区间按照左端点排序
- 之后将第一个区间的右端点放入堆中
- 遍历剩下的区间,比较当前区间左端点和堆顶元素(最小的元素),如果比堆顶元素大,那么将堆顶元素弹出(当前会议开始时间比堆顶的结束时间大,也即上一场会议可以结束)
- 将当前区间的右端点放入堆中(存储当前会议的结束时间)
- 最后堆的大小即为重叠的个数(最后堆中存储的就是会议还没结束的那些)
import heapq
def min_heap(nums):
heap = []
times = sorted(nums, key=lambda x: x[0])
heapq.heappush(heap, times[0][1])
for i in range(1, len(times)):
if times[i][0] >= heap[0]:
heapq.heappop(heap)
heapq.heappush(heap, times[i][1])
print(len(heap))