java - 如何计算可能的最大会议次数
问题描述
我正在尝试解决以下面试问题
给定两个数组 firstDay 和 lastDay 代表可能会议的天数。计算最大会议次数,每天只有一次会议。
示例:
输入:
第一天 = [1, 1, 3]; 最后一天= [1, 3, 3]
输出:
3
说明:
数组区间[i] = [firstDay[i], lastDay[i]]
在区间 [0] = [1, 1] 内,本次会议只能在第 1 天召开,所以是第 1 天的会议;
在区间 [1] = [1, 3] 中,可以在第 1、2 或 3 天举行会议,但是第 1 天已经很忙,第 3 天会干扰区间 [2],只剩下第 2 天会议;
在区间 [2] = [3, 3] 内,本次会议只能在第 3 天召开,所以是第 3 天的会议;
解决方案:(贪心算法)
public static int countMeetings(List<Integer> firstDay, List<Integer> lastDay) {
List<Interval> intervals = IntStream.range(0, firstDay.size())
.mapToObj(i -> new Interval(firstDay.get(i), lastDay.get(i)))
.sorted(Comparator.comparing(Interval::getEnd))
.collect(Collectors.toList());
List<Integer> meetings = new ArrayList<>();
intervals.forEach(interval -> {
for (int i = interval.getStart(); i <= interval.getEnd(); i++) {
if (!meetings.contains(i)) {
meetings.add(i);
break;
}
}
});
return meetings.size();
}
解决方案
看一下这个:
可以使用贪心算法解决这个问题:
static int getMaximumMeetings(List<Integer> start, List<Integer> timeTaken) {
List<Interval> list = new ArrayList<>(); // create a List of Interval
for (int i = 0; i < start.size(); i++) {
list.add(new Interval(start.get(i), start.get(i) + timeTaken.get(i)));
}
list.sort(Comparator.comparingInt(i -> i.end)); // sort by finish times ascending
int res = 0;
int prevEnd = Integer.MIN_VALUE; // finish time of the previous meeting
for (Interval i : list) {
if (i.start >= prevEnd) { // is there a conflict with the previous meeting?
res++;
prevEnd = i.end; // update the previous finish time
}
}
return res;
}
只是一些 Interval 实体的示例:
class Interval {
int start;
int end;
Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
如果您对上述代码有任何疑问,请在下方留言,我随时为您提供帮助。
推荐阅读
- containers - 服务容器未使用环境变量进行更新
- powerbi - 基于power bi中另一个表的过滤矩阵
- ajax - laravel modal 显示客户端信息
- jupyter-notebook - 在 Jupyter Notebook 中应用安全性的最佳方法是什么?
- python - 为字符串中的每个项目提供一个可变值?
- python - 如何在 PC 使用 python 关闭之前运行一个函数?
- asp.net-core - 如何将具有 IdentityServer 依赖项的 webapp 放入 Docker?
- user-interface - 以可视方式浏览 GCS 或 S3 存储桶(缩略图)
- powershell - 拒绝启动进程访问的 PowerShell 调用命令
- angular - 在返回值之前等待循环执行