comments | difficulty | edit_url | tags | ||||||
---|---|---|---|---|---|---|---|---|---|
true |
中等 |
|
给你一个会议时间安排的数组 intervals
,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi]
,返回 所需会议室的最小数量 。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]] 输出:2
示例 2:
输入:intervals = [[7,10],[2,4]] 输出:1
提示:
1 <= intervals.length <= 104
0 <= starti < endi <= 106
我们可以用差分数组来实现。
我们首先找到所有会议的最大结束时间,记为
然后,我们计算差分数组的前缀和,找出前缀和的最大值,即为所需会议室的最小数量。
时间复杂度
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
m = max(e[1] for e in intervals)
d = [0] * (m + 1)
for l, r in intervals:
d[l] += 1
d[r] -= 1
ans = s = 0
for v in d:
s += v
ans = max(ans, s)
return ans
class Solution {
public int minMeetingRooms(int[][] intervals) {
int m = 0;
for (var e : intervals) {
m = Math.max(m, e[1]);
}
int[] d = new int[m + 1];
for (var e : intervals) {
++d[e[0]];
--d[e[1]];
}
int ans = 0, s = 0;
for (int v : d) {
s += v;
ans = Math.max(ans, s);
}
return ans;
}
}
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
int m = 0;
for (const auto& e : intervals) {
m = max(m, e[1]);
}
vector<int> d(m + 1);
for (const auto& e : intervals) {
d[e[0]]++;
d[e[1]]--;
}
int ans = 0, s = 0;
for (int v : d) {
s += v;
ans = max(ans, s);
}
return ans;
}
};
func minMeetingRooms(intervals [][]int) (ans int) {
m := 0
for _, e := range intervals {
m = max(m, e[1])
}
d := make([]int, m+1)
for _, e := range intervals {
d[e[0]]++
d[e[1]]--
}
s := 0
for _, v := range d {
s += v
ans = max(ans, s)
}
return
}
function minMeetingRooms(intervals: number[][]): number {
const m = Math.max(...intervals.map(([_, r]) => r));
const d: number[] = Array(m + 1).fill(0);
for (const [l, r] of intervals) {
d[l]++;
d[r]--;
}
let [ans, s] = [0, 0];
for (const v of d) {
s += v;
ans = Math.max(ans, s);
}
return ans;
}
impl Solution {
pub fn min_meeting_rooms(intervals: Vec<Vec<i32>>) -> i32 {
let mut m = 0;
for e in &intervals {
m = m.max(e[1]);
}
let mut d = vec![0; (m + 1) as usize];
for e in intervals {
d[e[0] as usize] += 1;
d[e[1] as usize] -= 1;
}
let mut ans = 0;
let mut s = 0;
for v in d {
s += v;
ans = ans.max(s);
}
ans
}
}
如果题目中的会议时间跨度很大,那么我们可以使用哈希表来代替差分数组。
我们首先创建一个哈希表
然后,我们将哈希表按照键进行排序,计算哈希表的前缀和,找出前缀和的最大值,即为所需会议室的最小数量。
时间复杂度
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
d = defaultdict(int)
for l, r in intervals:
d[l] += 1
d[r] -= 1
ans = s = 0
for _, v in sorted(d.items()):
s += v
ans = max(ans, s)
return ans
class Solution {
public int minMeetingRooms(int[][] intervals) {
Map<Integer, Integer> d = new TreeMap<>();
for (var e : intervals) {
d.merge(e[0], 1, Integer::sum);
d.merge(e[1], -1, Integer::sum);
}
int ans = 0, s = 0;
for (var e : d.values()) {
s += e;
ans = Math.max(ans, s);
}
return ans;
}
}
class Solution {
public:
int minMeetingRooms(vector<vector<int>>& intervals) {
map<int, int> d;
for (const auto& e : intervals) {
d[e[0]]++;
d[e[1]]--;
}
int ans = 0, s = 0;
for (auto& [_, v] : d) {
s += v;
ans = max(ans, s);
}
return ans;
}
};
func minMeetingRooms(intervals [][]int) (ans int) {
d := make(map[int]int)
for _, e := range intervals {
d[e[0]]++
d[e[1]]--
}
keys := make([]int, 0, len(d))
for k := range d {
keys = append(keys, k)
}
sort.Ints(keys)
s := 0
for _, k := range keys {
s += d[k]
ans = max(ans, s)
}
return
}
function minMeetingRooms(intervals: number[][]): number {
const d: { [key: number]: number } = {};
for (const [l, r] of intervals) {
d[l] = (d[l] || 0) + 1;
d[r] = (d[r] || 0) - 1;
}
let [ans, s] = [0, 0];
const keys = Object.keys(d)
.map(Number)
.sort((a, b) => a - b);
for (const k of keys) {
s += d[k];
ans = Math.max(ans, s);
}
return ans;
}
use std::collections::HashMap;
impl Solution {
pub fn min_meeting_rooms(intervals: Vec<Vec<i32>>) -> i32 {
let mut d: HashMap<i32, i32> = HashMap::new();
for interval in intervals {
let (l, r) = (interval[0], interval[1]);
*d.entry(l).or_insert(0) += 1;
*d.entry(r).or_insert(0) -= 1;
}
let mut times: Vec<i32> = d.keys().cloned().collect();
times.sort();
let mut ans = 0;
let mut s = 0;
for time in times {
s += d[&time];
ans = ans.max(s);
}
ans
}
}