1. 程式人生 > >LeetCode253:Meeting Rooms II

LeetCode253:Meeting Rooms II

Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required.

For example,
Given [[0, 30],[5, 10],[15, 20]],
return 2.


1)可以按照每個區間的起點排序, 然後依次將每個區間的終點放到一個集合中,如果下一個區間起點大於等於之前某區間的終點, 就將其從集合中刪除. 這種做法的原理是如果一個區間的起點大於等於另一個區間的終點, 那麼他們是不重合的。

2)將這三個區間在x軸上畫出來,並用一條垂直於x軸的線作為掃描線從左至右掃描,會很容易得出答案,即與掃描線焦點的最大值即為所求。但是在程式中我們怎樣表示這種思想呢? 
-對所有點進行標記,區分起始點和終止點 
-對所有點進行排序 
-依次遍歷每個點,遇到起始點+1,遇到終止點-1,並更新記錄最大值
 

# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution:
    def minMeetingRooms(self, intervals):
        if intervals is None or len(intervals) == 0:
            return 0
        tmp = []
        # 標記起始點終止點
        for inter in intervals:
            tmp.append((inter.start, True))
            tmp.append((inter.end, False))
        # 排序
        tmp = sorted(tmp, key=lambda v: (v[0], v[1]))
        n = 0
        max_num = 0
        for arr in tmp:
            # 起始點+1
            if arr[1]:
                n += 1
            # 終止點-1
            else:
                n -= 1
            max_num = max(n, max_num)
        return max_num