重新开始战斗07-编程之美-高效见面会

问题描述:某一天,在微软亚洲研究院有N个面试要进行,它们的时间分别为(B[i], E[i])(B[i]为面试开始时间,E[i]为面试结束时间)。假设一个面试者一天只参加一个面试。为了给面试者提供一个安静便于发挥的环境,我们希望将这N个面试安排在若干个面试点。不同的面试在同一个时间不能被安排在同一个面试点。如果你是微软亚洲研究院的HR,现在给定这N个面试的时间之后,你能计算出至少需要多少个面试点吗?请给出一个可行的方案。


利用贪心算法策略:要使面试的地点最少,就必须尽可能的把面试时间互相不重叠的面试安排在同一个面试点。

即将不重叠的面试安排到一个面试点!


算法步骤

1)把面试集合S中的元素按其结束时间的递增顺序排列;

2)求其最大相互兼容面试集合M,并从原始集合S中删除之;

3)求集合S-M的最大相互兼容面试集合Q,并从集合S-M中删除之。重复此过程直到原始面试集合S中为空集为止;

4)统计求出的最大相互兼容面试集合的个数,即是面试集合S所需的最少面试点个数。


以上面的面试集合S为例,上述步骤用图像表示如下:每个图中用矩形框起来的面试为所属集合的最大相互兼容集合,一共有5个,即至少需要5个面试点。


      

这种贪心的最坏时间算法度应该是O(N2)


下面看看编程之美中精妙算法

我们已经很清楚,时间段上出现重叠的面试,一定会被安排在不同的面试点。i与j的时间段重叠,那么E[i] > B[j]。也就是说把i与j的时间段起始结束时刻排序,将得到顺序为B[i],B[j],E[i],E[j],而对于不重叠,排序的结果应该是B[i],E[i],B[j],E[j]。这一个很重要的信息——对于重叠,必然存在BBEE的情况,那么我们先将所有的时刻排序,然后依次遍历,遇到B就+1,遇到E就-1,因此,只有BEBEBEBE……的情况下,我们的计数器始终为1,如果有BB情况,那么就会出现2的情况,BBB则会出现3。BB代表两个时间段的重叠,BBB代表3个时间段的重叠,利用这种方法,就可以最后得到最小的地点数。


该算法的时间复杂度为排序的时间复杂度O(NLogN)加上最后遍历的时间复杂度O(2N),最后的时间复杂度为O(NLogN)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值