732. 我的日程安排表 III

732. 我的日程安排表 III

原始题目链接:https://leetcode.cn/problems/my-calendar-iii/

当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。

给你一些日程安排 [start, end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。

实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。

MyCalendarThree() 初始化对象。
int book(int start, int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。

示例:

输入:
[“MyCalendarThree”, “book”, “book”, “book”, “book”, “book”, “book”]
[[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
输出:
[null, 1, 1, 2, 3, 3, 3]

解释:
MyCalendarThree myCalendarThree = new MyCalendarThree();
myCalendarThree.book(10, 20); // 返回 1 ,第一个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(50, 60); // 返回 1 ,第二个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(10, 40); // 返回 2 ,第三个日程安排 [10, 40) 与第一个日程安排相交,所以最大 k 次预订是 2 次预订。
myCalendarThree.book(5, 15); // 返回 3 ,剩下的日程安排的最大 k 次预订是 3 次预订。
myCalendarThree.book(5, 10); // 返回 3
myCalendarThree.book(25, 55); // 返回 3

解题思路:

题目要求计算的是,每个新的日程时间表安排后,会产生的最大 k
次预订的值,那么在每次新添加日常后就需要统计当前的最大k次预定的值。使用一个计数器数据结构,开始时间start设置+1,结束时间设置-1,这样在目前的所以会议中,加入新的会议,并且符合交叉的情况的时候,就+1,如果会议结束就-1,由于是时间序列问题,所以需要从大到小排序,并且是每次加入新的安排都要排序。

代码实现:

class MyCalendarThree:

    def __init__(self):
        # 定义一个计数器,key是开始时间start和end,value分别是1和-1
        # 巧妙的是1和-1的设置,这样唯一的日程时间对可以抵消计数为0
        # 并且这是时间序列问题,所以需要排序,每次加入新的时间对都需要排序
        self.time = collections.Counter()

    def book(self, start: int, end: int) -> int:
        # 1表示会议开始
        self.time[start] += 1
        # -1表示会议结束
        self.time[end] -= 1

        cur_max = ans = 0
        
        # 因为是时间序列问题,所以每次都需要排序
        for i in sorted(self.time):
            # 用一个变量记录在当前有效时间里的最大k次预定
            # 当前会议还没结束又有新的会议在时间上交叉预定时,就会一直是+1状态
            # 如果当前其中有一个会议结束,那么是-1状态
            # 所以每次新加入会议安排时,都需要统计cur_max,得出当前的最大k次预定值
            cur_max += self.time[i]
            if cur_max > ans:
                ans = cur_max

        return ans




# Your MyCalendarThree object will be instantiated and called as such:
# obj = MyCalendarThree()
# param_1 = obj.book(start,end)

参考文献:
https://leetcode.cn/problems/my-calendar-iii/solution/wo-de-ri-cheng-an-pai-biao-iii-by-leetcode/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery是一种流行的JavaScript库,许多开发人员使用它来简化代码和提高可维护性。下面是一个使用jQuery和CSS创建日程安排的示例代码: HTML代码: ``` <div class="calendar"> <div class="header"> <div class="month">五月</div> <div class="year">2021年</div> </div> <table class="days"> <tr> <th>周日</th> <th>周一</th> <th>周二</th> <th>周三</th> <th>周四</th> <th>周五</th> <th>周六</th> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td>1</td> </tr> <!-- 省略其他日期行的代码 --> </table> </div> ``` CSS代码: ``` .calendar { font-family: Arial, sans-serif; font-size: 14px; width: 400px; margin: 0 auto; border: 1px solid #ccc; border-radius: 5px; padding: 10px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .month { font-size: 20px; font-weight: bold; } .days { border-collapse: collapse; width: 100%; } th { text-align: center; padding: 7px; } td { text-align: center; border: 1px solid #ccc; padding: 7px; } td:hover { background-color: #eee; } ``` JavaScript代码: ``` $(document).ready(function(){ var today = new Date(); var currentMonth = today.getMonth(); var currentYear = today.getFullYear(); var months = ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]; function generateCalendar(month, year) { $(".days td").empty().removeClass("today"); $(".month").text(months[month]); $(".year").text(year); var firstDay = new Date(year, month, 1); var startingDay = firstDay.getDay(); var monthLength = 32 - new Date(year, month, 32).getDate(); for (i = 1; i <= monthLength; i++) { if (i === today.getDate() && year === today.getFullYear() && month === today.getMonth()) { $(".days td").eq(startingDay + i - 2).addClass("today"); } $(".days td").eq(startingDay + i - 1).text(i); } } generateCalendar(currentMonth, currentYear); $(".prev").click(function(){ currentYear = (currentMonth === 0) ? currentYear - 1 : currentYear; currentMonth = (currentMonth === 0) ? 11 : currentMonth - 1; generateCalendar(currentMonth, currentYear); }); $(".next").click(function(){ currentYear = (currentMonth === 11) ? currentYear + 1 : currentYear; currentMonth = (currentMonth + 1) % 12; generateCalendar(currentMonth, currentYear); }); }); ``` 这个示例创建一个基本的日历并允许用户向前或向后浏览月份。它还突出显示今天日期的单元格。您可以根据需要调整CSS和JavaScript来适应您的日程安排需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值