LeetCode 253 会议室②
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]]
输出:2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:考虑转换为公交上下车,车上最多有多少人的问题,其实本质是一样的,我们只需要知道有哪些会议时间有冲突,即同一时刻在开的会议数量的最大值。可以有如下设计,会议开始时会议数量+1,会议结束时会议数量-1,如此可以将会议的开始和结束时间拆成两个类型,统一排序,进行一次遍历,遍历过程中最大的会议数量即是所需要的最少的会议室的数量。
func minMeetingRooms(intervals [][]int) int { nodes := make(Nodes, 0, len(intervals)*2) for _, interval := range intervals { nodes = append(nodes, Node{ time: interval[0], _type: 1, }, Node{ time: interval[1], _type: -1, }) } sort.Sort(nodes) ret := 0 max := 0 for _, node := range nodes { ret += node._type if max<ret { max = ret } } return max } type Node struct { time int _type int } type Nodes []Node func (n Nodes) Len() int { return len(n) } func (n Nodes) Swap(i, j int) { n[i], n[j] = n[j], n[i] } func (n Nodes) Less(i, j int) bool { if n[i].time == n[j].time { return n[i]._type == -1 } return n[i].time<n[j].time }