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
.
思路:标准扫描线算法,start event + 1, end event -1, 把所有的event点按照时间sort一下,如果时间相同,-1排在1前面,O(NlogN) + O(N).
class Solution {
private class Node {
public int time;
public int flag;
public Node(int time, int flag) {
this.time = time;
this.flag = flag;
}
}
public int minMeetingRooms(int[][] intervals) {
if(intervals == null || intervals.length == 0) {
return 0;
}
List<Node> list = new ArrayList<>();
for(int[] interval: intervals) {
list.add(new Node(interval[0], 1));
list.add(new Node(interval[1], -1));
}
int count = 0;
int maxcount = 0;
Collections.sort(list, (a, b) -> (a.time != b.time ? a.time - b.time : a.flag - b.flag));
for(Node node: list) {
if(node.flag == 1) {
count++;
} else {
count--;
}
maxcount = Math.max(maxcount, count);
}
return maxcount;
}
}
也可以用treemap写,<Integer, Integer> 分别代表的是start 和出现的次数. start的时候,+1, end的时候,-1;然后过keyset,就是扫描一遍,求最大;
class Solution {
public int minMeetingRooms(int[][] intervals) {
TreeMap<Integer, Integer> treemap = new TreeMap<>();
for(int[] interval: intervals) {
treemap.put(interval[0], treemap.getOrDefault(interval[0], 0) + 1);
treemap.put(interval[1], treemap.getOrDefault(interval[1], 0) - 1);
}
int maxcount = 0;
int count = 0;
for(Integer key: treemap.keySet()) {
count += treemap.get(key);
maxcount = Math.max(maxcount, count);
}
return maxcount;
}
}