Scheduler类schedule方法最大不重叠会议逻辑修复求助
会议调度问题的排查与修复
问题根源
现有Scheduler类的逻辑错误在于贪心策略的排序规则不符合最优要求:大概率是直接按会议开始时间排序后选择,这种方式无法保证选出最多数量的无重叠会议,甚至会选中重叠的会议,同时也没有处理多解时的优先级规则(结束日期字典序最小、结束相同选开始最早)。
修复方案
要实现题目要求的最优调度,必须采用正确的贪心策略:
- 排序优先规则:先按会议结束日期的字典序升序排列;若结束日期相同,则按开始时间升序排列。这种排序能确保每次选中的会议最早结束,为后续会议预留最多时间,从而最大化会议数量,同时满足多解时的优先级要求。
- 无重叠筛选:遍历排序后的会议,只保留与已选中会议无重叠的会议(即当前会议的开始时间 > 最后一个选中会议的结束时间)。
修复后的Scheduler类代码
import java.util.ArrayList; import java.util.List; // 假设Meeting类为题目给定的无需修改结构 // class Meeting { // private String start; // private String end; // public String getStart() { return start; } // public String getEnd() { return end; } // } class Scheduler { public void schedule(List<Meeting> meetings) { if (meetings == null || meetings.isEmpty()) { return; } // 按规则排序:结束日期字典序升序优先,结束相同则按开始时间升序 meetings.sort((m1, m2) -> { int endCompare = m1.getEnd().compareTo(m2.getEnd()); if (endCompare != 0) { return endCompare; } return m1.getStart().compareTo(m2.getStart()); }); List<Meeting> optimalMeetings = new ArrayList<>(); optimalMeetings.add(meetings.get(0)); for (int i = 1; i < meetings.size(); i++) { Meeting last = optimalMeetings.get(optimalMeetings.size() - 1); Meeting current = meetings.get(i); // 判定无重叠:当前会议开始时间严格晚于上一个会议的结束时间 if (current.getStart().compareTo(last.getEnd()) > 0) { optimalMeetings.add(current); } } // 替换原列表为最优结果 meetings.clear(); meetings.addAll(optimalMeetings); } }
逻辑解释
- 排序阶段:自定义比较器严格遵循题目要求的多解优先级,确保在可选范围内,我们总是优先选择结束更早的会议,这是贪心算法中最大化无重叠会议数量的经典策略。
- 筛选阶段:从排序后的第一个会议开始,逐个检查后续会议是否与已选中的最后一个会议重叠,只保留无重叠的会议,最终得到的就是数量最多且符合优先级的会议组合。
- 列表修改:通过清空原列表并添加最优结果,满足题目要求的“修改传入列表”的操作方式。
内容的提问来源于stack exchange,提问作者qSplatt Rams
相关产品推荐
相关产品推荐

