目录
1.题目描述
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:输入: [[7,10],[2,4]]
输出: 1
2.解题思路
分别保存起始时间和结束时间,然后各自排个序,定义结果变量 res 和结束时间指针 j,然后开始遍历,如果当前起始时间小于结束时间指针的时间,则结果自增1,反之结束时间指针自增1,这样可以找出重叠的时间段,从而安排新的会议室
每遇到一个会议安排A,A的开始时间要与已有会议室的最早结束时间比较。如果A的开始时间 大于等于 已有会议室的最早结束时间时无需新增会议室。因为到时后,这个会议室一定是空的。
参考:力扣
3.代码实现
class Solution(object):
def minMeetingRooms(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
if not intervals:
return 0
used_rooms = 0
start_timings = sorted([i[0] for i in intervals])
end_timings = sorted(i[1] for i in intervals)
L = len(intervals)
j = 0
for i in range(L):
if start_timings[i] < end_timings[j]:
used_rooms+=1
else:
j+=1
return used_rooms
附上另一种解题方法,C++版本
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
map<int, int> m;
for(auto& v: intervals) m[v[0]]++, m[v[1]]--;
int ans = 0, res = 0;
# 按照key值从小到大排序,如果相同,则value值小的排在前面
# 例如(10,-1) 放在 (10,1)前面
for(auto& it: m) {
ans += it.second;
res = max(res, ans);
}
return res;
}
};
作者:trsteel
链接:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/xian-duan-shu-qu-jian-geng-xin-dan-dian-qiu-zhi-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2021/10/26回顾
差分数组解题思路
代码实现
class Solution:
def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
diff = [0 for _ in range(n+2)]
for book in bookings:
diff[book[0]] += book[2]
diff[book[1]+1] -= book[2]
sum_= 0
res = []
for d in diff[1:-1]:
sum_ += d
res.append(sum_)
return res
高效版
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
if not intervals:
return 0
# 优化存储,dict代替list
diff = collections.defaultdict(int)
for interval in intervals:
diff[interval[0]] += 1
diff[interval[1]] -= 1
sum_= 0
res = 0
# 代替对list求前缀和
diff = sorted(diff.items(), key= lambda item: item[0])
for k,v in diff:
sum_ += v
res = max(res,sum_)
return res