题目:
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
方法一:
思路1:
解答1:
class Solution:
def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
starts=[]
ends=[]
for start,end in startEnd:
starts.append(start);
ends.append(end);
starts.sort();
ends.sort()
# 统计同一时间的活动个数
count = 0
max_num = 0
# 活动索引号
i, j = 0, 0
while i < n and j < n:
# 有新活动开始
if starts[i] < ends[j]:
# 转到下个活动的开始时间作对比
i += 1
count += 1
# 记录过程中的最大个数
max_num = max(max_num, count)
# 一个活动开始同时一个活动结束
elif starts[i] == ends[j]:
i += 1
j += 1
# 一个活动结束
else:
# 转到下个活动的结束时间作对比
j += 1
count -= 1
# 返回最大值(同一时间最多有多少个活动在举行)
return max_num
方法二:
思路2:
将活动开始时间写入一个列表starts,进行排序。
将活动结束时间写入一个列表ends,进行排序。
每次活动开始时,需要增加一个主持人上场,每次活动结束时候可以释放一个主持人。
所以按照时间先后顺序对starts进行遍历,每次有活动开始count++,每次有活动结束count–
在count最大的时候,即是需要主持人最多的时候
解答2:
class Solution:
def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
starts=[]
ends=[]
for start,end in startEnd:
starts.append(start);
ends.append(end);
starts.sort();
ends.sort()
i,j,count,res=0,0,0,0
#time为当前时间
for time in starts:
#若当前时间(time)活动i开始,则需要新增一个主持人
while(i<n and starts[i]<=time):
i+=1
count+=1
#若当前时间(time)活动j结束,则可以释放一个主持人
while(j<n and ends[j]<=time):
j+=1
count-=1
if count>res:
res=count
#print(time,i,j,count,res)
return res