【JAVA】【刷题子】732. 我的日程安排表

【JAVA】【刷题子】732. 我的日程安排表,第1张

愿高三学子们都高考顺利,金榜题名,旗开得胜,考上理想大学! 一、题目与题目分析 题目

当 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:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》

  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1325243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存