栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

文章小尾巴

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954349.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号