本文共 1688 字,大约阅读时间需要 5 分钟。
给定一系列会议的开始和结束时间组成的数组,会议时长都是大于0的。问最少需要多少个会议室。
解决这个问题的关键在于使用扫描线算法。具体步骤如下:
事件处理:将每个会议的开始和结束时间分别记录为两个事件。开始事件用+1标记,结束事件用-1标记。
排序事件:将所有事件按照时间排序。如果时间相同,则结束事件排在前面(因为结束事件处理完后,才会处理开始事件,这样可以正确计算当前活动数量)。
统计活动数:遍历排序后的事件列表,逐个处理每个事件,更新当前活动数。记录当前活动数的最大值,这个最大值即为最少需要的会议室数。
import java.util.ArrayList;import java.util.List;public class Solution { class Pair { int time; int flag; public Pair(int time, int flag) { this.time = time; this.flag = flag; } } public int minMeetingRooms(List intervals) { if (intervals == null || intervals.isEmpty()) { return 0; } List list = new ArrayList<>(); for (Interval interval : intervals) { list.add(new Pair(interval.start, 1)); list.add(new Pair(interval.end, 0)); } list.sort((p1, p2) -> { if (p1.time != p2.time) { return Integer.compare(p1.time, p2.time); } else { return Integer.compare(p1.flag, p2.flag); } }); int res = 0, count = 0; for (Pair pair : list) { if (pair.flag == 1) { count++; } else { count--; } res = Math.max(res, count); } return res; } class Interval { int start; int end; public Interval(int start, int end) { this.start = start; this.end = end; } }} 通过上述方法,可以有效地解决会议室安排问题,确保最少需要的会议室数正确无误。
转载地址:http://xzcs.baihongyu.com/