首页 > 试题广场 >

主持人调度(二)

[编程题]主持人调度(二)
  • 热度指数:62707 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

数据范围: -2^{32} \le start_i\le end_i \le 2^{31}-1

复杂度要求:时间复杂度 ,空间复杂度
示例1

输入

2,[[1,2],[2,3]]

输出

1

说明

只需要一个主持人就能成功举办这两个活动      
示例2

输入

2,[[1,3],[2,4]]

输出

2

说明

需要两个主持人才能成功举办这两个活动      

备注:
start_i,end_i在int范围内
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算成功举办活动需要多少名主持人
# @param n int整型 有n个活动
# @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
# @return int整型
#
import heapq  
class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        sorted_arr = sorted(startEnd, key=lambda x : x[0])

        min_heap = []  

        res = 0
        stack = 0
        for arr in sorted_arr:
            # 堆不为空,尝试释放主持人
            if len(min_heap) != 0:

                if min_heap[0] <= arr[0]:
                # 能够释放主持人
                    heapq.heappop(min_heap)
                    heapq.heappush(min_heap, arr[1])
                   
                else:
                # 不能释放主持人
                    heapq.heappush(min_heap, arr[1])
                    res += 1
                continue

            # 空堆,只能请主持人
            heapq.heappush(min_heap, arr[1])
            res += 1
       
        return res
           
发表于 2024-02-01 23:00:25 回复(0)
class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        sort_startend = sorted(startEnd, key = lambda x:x[0])
        hosts =[]
        for it in sort_startend:
            if len(hosts)>0 and it[0] >= hosts[0]:
                heappop(hosts)
            heappush(hosts,it[1])
        return len(hosts)

发表于 2023-12-19 23:24:21 回复(0)
class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code hereq
        #start i 表示活动开始的时间点
        #end_j 表示,当前num个主持人中,最先结束的时间点
        #如果有人活动结束,那么最先结束的主持人借这个活动,结束的时间点顺延
        #如果活动开始的时间点大于当前主持人中最先结束的时间,需要新加一位主持人
        start=sorted([x[0] for x in startEnd])
        end=sorted([x[1] for x in startEnd])
        num=0
        j=0
        for i in range(n):
            if start[i]>=end[j]:
                j+=1
            else:
                num+=1
        return num

发表于 2023-09-17 11:06:03 回复(0)
class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        if n==0 : return 0
        startime = []
        endtime = []
        count = 0
        max_count = -1
        for i in range(n):
            startime.append(startEnd[i][0])
            endtime.append(startEnd[i][1])
        startime.sort()
        endtime.sort()

        i,j = 0, 0
        while i<n and j<n:
            # 区间重叠了count++
            if startime[i] < endtime[j]:
                count += 1
                i += 1
                # count 最大时是需要主持人最多的时候
                max_count = max(count, max_count)
            #活动结束释放资源
            else:
                count -= 1
                j += 1

        return max_count


发表于 2023-08-29 16:48:17 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算成功举办活动需要多少名主持人
# @param n int整型 有n个活动
# @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
# @return int整型
#
class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        ## 分离 开始时间和结束时间 start和end 
        start = [i[0] for i in startEnd]
        end = [i[1] for i in startEnd] 
        
        ## 排序 :如果有交叉,则就需要加一个主持人 
        start.sort()  
        end.sort() 
        
        ## 使用一个循环控制两个数组 
        num = 0 
        end_time = 0 
        for i in range(n): 
            if start[i] >= end[end_time]: 
                end_time += 1   ## 无交叉情况,后移end_time  
            else: 
                num += 1     ## 有交叉,主持人数量 + 1 
        return num 
        
        

发表于 2022-07-21 10:49:07 回复(2)
from heapq import *

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        pq = []
        startEnd.sort()
        for i in range(len(startEnd)):
            if len(pq)>0 and pq[0]<=startEnd[i][0]:
                heappop(pq)
            heappush(pq,startEnd[i][1])
        return len(pq)

发表于 2021-12-11 16:30:05 回复(0)