Meeting Rooms II
Last updated
Last updated
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public int minMeetingRooms(Interval[] intervals) {
if (intervals == null || intervals.length == 0) return 0;
int[] starts = new int[intervals.length];
int[] ends = new int[intervals.length];
for (int i = 0; i < intervals.length; ++i) {
starts[i] = intervals[i].start;
ends[i] = intervals[i].end;
}
Arrays.sort(starts);
Arrays.sort(ends);
int count = 0;
int i = 0, j = 0;
while (i < starts.length) {
if (starts[i] < ends[j]) {
// 说明当前情况下没有新的会议结束,即无空房,要开新房
count++;
i++;
} else {
// 说明有之前开始的某场会议已经结束,可以使用之前的房间
i++;
j++;
}
}
return count;
}
}class Solution {
private class Event {
int time;
boolean start;
public Event(int time, boolean start) {
this.time = time;
this.start = start;
}
}
public int minMeetingRooms(Interval[] intervals) {
Event[] arr = new Event[intervals.length * 2];
for (int i = 0; i < intervals.length; ++i) {
arr[2 * i] = new Event(intervals[i].start, true);
arr[2 * i + 1] = new Event(intervals[i].end, false);
}
Arrays.sort(arr, (a, b)->{
if (a.time != b.time) {
return Integer.compare(a.time, b.time);
} else if (a.start) {
return 1;
} else return -1;
});
int maxOverlap = 0, overlap = 0;
for (int i = 0; i < arr.length; ++i) {
if (arr[i].start) {
overlap++;
maxOverlap = Math.max(maxOverlap, overlap);
} else {
overlap--;
}
}
return maxOverlap;
}
}class Solution {
class Event {
int time;
boolean start;
Event(int time, boolean start) {
this.time = time;
this.start = start;
}
}
public int minMeetingRooms(int[][] intervals) {
List<Event> events = Arrays.stream(intervals)
.flatMap(interval -> {
return Arrays.asList(
new Event(interval[0], true),
new Event(interval[1], false)
).stream();
}).sorted((a, b) -> {
if (a.time != b.time) {
return Integer.compare(a.time, b.time);
} else {
return Boolean.compare(a.start, b.start);
}
}).collect(Collectors.toList());
int maxCount = 0;
int count = 0;
for (Event e : events) {
if (e.start) count++;
else count--; // 无需检查count==0,因为一定不会小于0
maxCount = Math.max(count, maxCount);
}
return maxCount;
}
}