主持人调度

联系一下美团三面的题。两个排序数组,进行合并。
[[1, 3], [6, 10]], [[2, 5], [7, 11]]
合并: [[1, 5], [6, 11]]
解题方法就是每次抽取两个数组中首位最小的,然后与前面提取的末位进行比较,如果小于末位,就可以融合,否则新起一组。

下面的题目其实就是求 最大的有公共区间的数目。

在这里插入图片描述
这道题极有可能面试题,第一种做法很常规,记录每次的结束时间,但是需要排序,因为只需要确定当前的开始时间比记录的结束时间大,那么就不需要增加一个老师。

heapq主要是heapq.heappush和heapqpop得到的就是堆。但是如果是一开始就是List,可以用heapsort。其实要注意,heapq.heapify就是变成堆,但是堆的顺序不代表堆排序后的顺序!!!堆排序后才能得到从小到大的数组。–堆排序可以是最小堆每次拿出第一个。

import heapq
class Solution:
    def minmumNumberOfHost(self , n , startEnd ):
        # write code here
        # 这里用堆的原因其实很明显,先开始不代表先结束。所以我需要把进入堆里的最早结束的进行对比
        res = []
        result = 0
        startEnd = sorted(startEnd, key= lambda x:x[0])
        for i in range(0, n):
            while res:
                if startEnd[i][0] >= res[0]:
                    heapq.heappop(res)
                else:
                    break
            heapq.heappush(res, startEnd[i][1])
            if len(res) > result:
                result = len(res)
        return result

其实细想两种方法是一致的,只是把结束时间提前排了序号。
如果是完全没有交集,那么必定下一位的开头肯定比上一位的结尾大。
[[1,3],[5,6],[7,8]], 如果不大,说明出现交集。那么如果判断到底多少个有交集。那么就是这一位不往后移动了,继续与下一个的开头比较,如果还是小,继续添加老师人数。也就是第二种做法~

class Solution:
    def minmumNumberOfHost(self , n , startEnd ):
        # write code here
        res = []
        result = 0
        end = 0
        res1 = sorted(startEnd, key = lambda x:x[0])
        res2 = sorted(startEnd, key = lambda x:x[1])
        for i in range(len(res1)):
            if res1[i][0]  >= res2[end][1]:
                end += 1
            else:
                result += 1
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值