1. 程式人生 > 其它 >LeetCode 253 會議室②

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
}