2020-04-18 22:21:06
問題描述:
你有一個當前會議列表intervals
,里面表明了每個會議的開始和結束時間,以及一些會議室rooms
。現在有一系列會議ask
需要加入,逐個判斷他們能否被安排進當前的會議列表中而不產生沖突。一個會議室在同一時間只能進行一場會議。每個詢問都相互獨立。
樣例
例 1:
輸入:Intervals:[[1,2],[4,5],[8,10]],rooms = 1,ask: [[2,3],[3,4]]
輸出: [true,true]
解釋:
對於[2,3]的詢問,我們可以安排一個會議室room0。
以下是room0的會議列表:
[[1,2],[2,3],[4,5],[8,10]]
對於[3,4]的詢問,我們可以安排一個會議室room0。
以下是room0的會議列表:
[[1,2],[3,4],[4,5],[8,10]]
例 2:
輸入:
[[1,2],[4,5],[8,10]]
1
[[4,5],[5,6]]
輸出:
[false,true]
注意事項
保證輸入可以被安排在rooms
個會議室之中
保證任意一個會議的結束時間不大於50000
|Intervals|<=50000
|ask|<=50000
rooms<=20
問題求解:
非常好的題目,巧妙的將區間判重和最大重疊區間問題結合了起來。
時間復雜度:O(nlogn)
public boolean[] meetingRoomIII(int[][] intervals, int rooms, int[][] ask) { Map<Integer, Integer> map = new HashMap<>(); for (int[] inte : intervals) { map.put(inte[0], map.getOrDefault(inte[0], 0) + 1); map.put(inte[1], map.getOrDefault(inte[1], 0) - 1); } List<int[]> record = new ArrayList<>(); for (int key : map.keySet()) record.add(new int[]{key, map.get(key)}); Collections.sort(record, (o1, o2) -> Integer.compare(o1[0], o2[0])); List<int[]> pos = new ArrayList<>(); int presum = 0; for (int i = 0; i < record.size(); i++) { presum += record.get(i)[1]; if (presum == rooms) pos.add(new int[]{record.get(i)[0], record.get(i + 1)[0]}); } boolean[] res = new boolean[ask.length]; if (pos.size() == 0) { Arrays.fill(res, true); return res; } for (int i = 0; i < ask.length; i++) { int idx = helper(pos, ask[i]); if (idx != pos.size() && pos.get(idx)[0] < ask[i][1]) res[i] = false; else if (idx != 0 && pos.get(idx - 1)[1] > ask[i][0]) res[i] = false; else res[i] = true; } return res; }