当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。
给你一些日程安排 [start, end)
,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。
实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。
- MyCalendarThree() 初始化对象。
- int book(int start, int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。
(题目来源:力扣:732. 我的日程安排表 III)
题目看起来有点复杂,笔者也是理解半天。也看了“答案区”(讨论区),才理解;这道题可以认为,有一辆公交车,每个人都可以随时上车,也可以随时下车。在公交车上出现过最多人数的,就是为该题答案。
进而致,我们回到题目来,这个日程安排就是一辆公交车,每个日程安排就是对应一个乘客。乘客到达了想到的地方地点也就下车了(日程也算安排完事了)。
最后,公交车抵达终点(日程全部安排完成),就可以求在公交车上出现过最多人数了。(日程安排里最大的k次预订了)
题目分析已经比较清楚了,接下来我们进入代码设计。
整体逻辑(当前已设定是用求公交车上下车最多人数来做。)
首先,我们要清楚,我们要对应每个人的上下车顺序记录好,什么时候上车,什么时候下车。因此,我们所选用的是TreeMap,因为TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap
。
整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
class MyCalendarThree {
// 记录上公交车的人(也包括记录了顺序)
private TreeMap<Integer, Integer> busMap;
public MyCalendarThree() {
busMap = new TreeMap<>();
}
public int book(int start, int end) {
// 记录啥时候上车,该时间有没有人也上车,有就把已经记录上车的人+1;无则默认值+1(默认值为0)
busMap.put(start, busMap.getOrDefault(start, 0) + 1);
// 记录啥时候下车,该时间有没有人下车,有把已下车的人数记录-1;无则默认值-1(默认值为0)
busMap.put(end, busMap.getOrDefault(end, 0) - 1);
// 记录同时在车上最多的人数
int peopleMax = 0;
// 记录当前车上的人数
int count = 0;
for (Integer num : busMap.values()) { // 遍历时间里人数出入的情况
// 因为是根据顺序上下车,num是当前已经计算好上下车的人数。
count += num;
// 找到活跃事件数量最多的时刻,记录下来。
if (count > peopleMax) { // 判断当前车上的人是否比这个时间前更多人
peopleMax = count;
}
}
return peopleMax;
}
}
解题区(讨论区)的答案
到这里,你看了笔者的公交车解答,理解后;再去看层主的解答,这时候就比较清晰了~
层主:hackfun
class MyCalendarThree {
private TreeMap<Integer, Integer> calendar;
public MyCalendarThree() {
calendar = new TreeMap<>();
}
public int book(int start, int end) {
// 添加至日程中
calendar.put(start, calendar.getOrDefault(start, 0) + 1);
calendar.put(end, calendar.getOrDefault(end, 0) - 1);
// 记录最大活跃的日程数
int max = 0;
// 记录活跃的日程数
int active = 0
for (Integer d : calendar.values()) {
// 以时间线统计日程
active += d;
// 找到活跃事件数量最多的时刻,记录下来。
if (active > max) {
max = active;
}
}
return max;
}
}
三、结果展示
四、总结
学以致用,做题不光要做,能把他人也解释明白,那才是真的会!(加油!)
题目数据库Gitee:传送门
文章小尾巴文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)