堆之最大重叠子区间(会议室)

最大重叠子区间

给出n个区间,找出重叠子区间的最大数量
例:
输入
1 4
1 2
2 3
3 4
输出

解释,最大重叠子区间出现在[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))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值