刷
June-18-2019
变体,条件和上一题一样,但是让算最多同时有多少会议进行。
按startTime sort array
PQ based on endTime to track on-going meetings.
遍历array,每有一个meeting,看下再这个会开始前有多少个在进行的会结束了,看PQ里的endTime。
维持PQ的最大SIZE就是答案。
public int minMeetingRooms(int[][] intervals) {
if (intervals.length <= 1) return intervals.length;
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] A, int[] B) {
return Integer.compare(A[0], B[0]);
}
});
PriorityQueue<Integer> endTimePQ = new PriorityQueue<>();
int res = -1;
for (int[] interval : intervals) {
int startTime = interval[0];
while (!endTimePQ.isEmpty() && endTimePQ.peek() <= startTime) {
endTimePQ.poll();
}
endTimePQ.offer(interval[1]);
res = Math.max(res, endTimePQ.size());
}
return res;
}
还有一种楞做法
所有timeStamp排列,负的代表结束,看看同时进行的最大是多少
唯一需要注意的就是时间相等的情况下,如果一个是开始,一个是结束,要把开始放在前面先算。
public int minMeetingRooms(int[][] intervals) {
if (intervals.length <= 1) return intervals.length;
Integer[] timeStamp = new Integer[intervals.length * 2];
for (int i = 0; i < intervals.length; i++) {
timeStamp[i * 2] = intervals[i][0];
timeStamp[i * 2 + 1] = -intervals[i][1];
}
Arrays.sort(timeStamp, new Comparator<Integer>() {
public int compare(Integer i1, Integer i2) {
if (Math.abs(i1) == Math.abs(i2)) {
if (i1 < 0) {
return -1;
} else {
return 1;
}
}
return Integer.compare(Math.abs(i1), Math.abs(i2));
}
});
int tempMeetingCount = 0;
int res = 0;
for (int i = 0; i < timeStamp.length; i ++) {
if (timeStamp[i] >= 0) {
tempMeetingCount ++;
res = Math.max(res, tempMeetingCount);
} else {
tempMeetingCount --;
}
}
return res;
}