获得徽章 0
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
一、题目链接
leetcode.cn
二、题目简介
会议室问题,给定 n 个会议的开始时间和结束时间,同一时间内一间会议室只能开一场会,问开完所有会议最少需要多少个会议室
三、涉及知识点
排序
四、算法分析
解法一:排序
我们首先对intervals的首项也就是开始时间排序,然后枚举所有时刻,也就是从 1 到最后一个会议结束的时刻,如果当前时刻有一个会议开始了,我们将cur+1,如果有一个会议结束了,我们将cur-1,然后每个时刻都更新ret即可
时间复杂度O(m),m为最后一个会议开完的时刻
五、源码解析
Golang
func minMeetingRooms(intervals [][]int) int {
n := len(intervals)
sort.Slice(intervals, func(i, j int) bool {
if intervals[i][0] == intervals[j][0] {
return intervals[i][1] < intervals[j][1]
}
return intervals[i][0] < intervals[j][0]
})
maxt := intervals[n-1][1]
idx := 0
ret := 0
cur := 0
end := make(map[int]int)
for i := 0; i <= maxt; i++ {
if _, ok := end[i]; ok {
cur -= end[i]
}
for idx < n && intervals[idx][0] <= i {
cur++
ret = max(ret, cur)
end[intervals[idx][1]]++
idx++
}
}
return ret
}
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
六、FAQ
二、题目简介
会议室问题,给定 n 个会议的开始时间和结束时间,同一时间内一间会议室只能开一场会,问开完所有会议最少需要多少个会议室
三、涉及知识点
排序
四、算法分析
解法一:排序
我们首先对intervals的首项也就是开始时间排序,然后枚举所有时刻,也就是从 1 到最后一个会议结束的时刻,如果当前时刻有一个会议开始了,我们将cur+1,如果有一个会议结束了,我们将cur-1,然后每个时刻都更新ret即可
时间复杂度O(m),m为最后一个会议开完的时刻
五、源码解析
Golang
func minMeetingRooms(intervals [][]int) int {
n := len(intervals)
sort.Slice(intervals, func(i, j int) bool {
if intervals[i][0] == intervals[j][0] {
return intervals[i][1] < intervals[j][1]
}
return intervals[i][0] < intervals[j][0]
})
maxt := intervals[n-1][1]
idx := 0
ret := 0
cur := 0
end := make(map[int]int)
for i := 0; i <= maxt; i++ {
if _, ok := end[i]; ok {
cur -= end[i]
}
for idx < n && intervals[idx][0] <= i {
cur++
ret = max(ret, cur)
end[intervals[idx][1]]++
idx++
}
}
return ret
}
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
六、FAQ
展开
评论
点赞