方法1:排序后找同一时间的最大会议数
思路:
会议开始和结束时间放到一个数组里,开始对应1,结束对应-1,其实是元组放进数组。
排序
设置一个累加数cur,遍历数组进行累加开始和结束出现对应的+1或-1,找最大的cur
遇到开始时间就+1,遇到结束时间就-1
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
events = [(i[0],1) for i in intervals] + [(i[1],-1) for i in intervals]
events.sort()
res,cur = 0,0
for _,e in events:
cur += e
res = max(res,cur)
return res
方法2:贪心
思路:
把会议的开始时间和结束时间放到两个数组中,然后排序。
遍历:如果开始时间小于结束时间,就让room+1,开始时间指针右移;否则,就让room-1,结束时间指针右移
返回room即可
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
#贪心
if not intervals: return 0
used_rooms = 0
start_time = sorted([i[0] for i in intervals])
end_time = sorted([i[1] for i in intervals])
n = len(intervals)
start_pointer ,end_pointer = 0,0
while start_pointer < n:
if start_time[start_pointer] >= end_time[end_pointer]:
used_rooms -= 1
end_pointer += 1
used_rooms += 1
start_pointer += 1
return used_rooms
方法1:
时间复杂度:O(NlogN)
空间复杂度:O(N)
方法2:
时间复杂度:O(NlogN)
空间复杂度:O(N)