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; }