每日一道笔试题,同学们可以进行自我测试一下,下午公布参考答案~
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]]
输出:2
示例 2:
输入:intervals = [[7,10],[2,4]]
输出:1
提示:
1 <= intervals.length <= 104
0 <= starti < endi <= 106
解答:排序队列+贪心算法
public class Day1 {
public static void main(String[] args) {
int[][] ints = new int[][]{{0,30},{5,10},{15,30},{10,15}};
System.out.println(new Day1().getMin(ints));
}
public int getMin(int[][] intervals) {
//用可排序的队列实现一个升序排列的队列,用于模拟会议室个数。
PriorityQueue<Integer> minNum = new PriorityQueue<>(intervals.length, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
//将intervals按照开始时间排序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] -o2[0];
}
});
//将第一个会议的结束时间设置为第一个会议室的解封时间
minNum.add(intervals[0][1]);
//遍历会议
for (int i = 1; i < intervals.length; i++) {
//如果当前会议的开始时间<队头的会议室结束时间(所有会议室中快结束的),那么队列中就没有会议能够满足情况,那么需要单独开辟一个会议室
if (intervals[i][0] < minNum.peek()){
minNum.add(intervals[i][1]);
}
//如果当前会议开始时间>=会议室最快结束的会议时间,那么就更新这个会议室的结束时间
else {
minNum.poll();
minNum.add(intervals[i][1]);
}
}
//返回会议室的长度
return minNum.size();
}
}