描述
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:
输入: [[7,10],[2,4]]
输出: 1
思路
1. 先将会议时间按照开始时间进行排序
2. 用最小堆存放会议的结束时间
3. 遍历会议curInterval:
1) 如果curInterval开始时间大于最小堆的堆顶即 已申请会议室的最小结束时间, 则不需要申请会议室,将堆顶替换为当前遍历的会议结束时间 重新堆排序
2) 如果curInterval开始时间小于最小堆的堆顶即 已申请会议室的最小结束时间,则需要申请一个新的会议室,将当前会议的结束时间加入堆中 重新排序
实现
type MeetingSlice [][]int
func (s MeetingSlice) Len() int { return len(s) }
func (s MeetingSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s MeetingSlice) Less(i, j int) bool { return s[i][0] < s[j][0] }
func minMeetingRooms(intervals [][]int) int {
sort.Sort(MeetingSlice(intervals))
heap := make([]int, 0)
for _, interval := range intervals{
if len(heap) == 0{
heap = append(heap, interval[1])
}else{
if interval[0] >= heap[0]{
heap[0] = interval[1]
}else{
heap = append(heap, interval[1])
}
minMeetingRoomsBuildHeap(heap)
}
}
return len(heap)
}
func minMeetingRoomsBuildHeap(nums []int){
size := len(nums)
for i := size-1; i >= 0; i--{
minMeetingRoomsHeapBody(nums, size, i)
}
}
func minMeetingRoomsHeapBody(nums []int, size, curRoot int){
left := 2*curRoot+1
right := 2*curRoot+2
smallest := curRoot
if left < size && nums[smallest] > nums[left]{
smallest = left
}
if right < size && nums[smallest] > nums[right]{
smallest = right
}
if smallest != curRoot{
nums[smallest], nums[curRoot] = nums[curRoot], nums[smallest]
minMeetingRoomsHeapBody(nums, size, smallest)
}
return
}