做实验时的一些心得

计算最大重叠区间个数的一种方法

问题描述

  • 实现一个EventManager类来管理个人日程,通过该类的一个方法
  • book(int day, int start, int end)
  • 来添加新事件
  • 待添加的新事件发生在day,这是一个整数,表示一年里的第day天
  • start表示事件的起始时间,为该day天的第start小时
  • end表示该事件的结束时间,为该day天的第end小时。
  • 例如:
  • book(1,8,10)表示添加一个在1月1日(第1天)的8点开始,10点结束的事件。
  • book(1, 0, 1)表示在第1天的0:00-1:00的事件
  • book(1, 22,24)表示在第1天的22:00-24:00的事件
  • 事件的长度单位是小时,不需要考虑分钟。
  • 约束条件:1<=day<=365(无需考虑闰年之类的问题),0<=start<end<=24。
  • “k-重叠”是指:有k个事件的时间范围在某个时间段内存在交集,即这k个事件在某个小时内都已经启动且尚未结束。
  • book(…)方法的返回值是:当本次调用结束后的最大k值。
  • 例如:
  • EventManager.book(1, 10, 20); // returns 1
  • EventManager.book(1, 1, 7); // returns 1
  • EventManager.book(1, 10, 22); // returns 2
  • EventManager.book(1, 5, 15); // returns 3
  • EventManager.book(1, 5, 12); // returns 4
  • EventManager.book(1, 7, 10); // returns 4

解决方法

类似时间这种线性的变量,可将其转化在数轴上解决
这里运用了Treemap集合,key值为时间,value为当前时间的活跃活动,该集合默认以key按自然顺序排列。
当活动开始时,就在key值为start的点将其值+1
同样,活动结束时,就在key值为start的点将其值-1
之后,遍历所有map比较得出最大值

主要代码为

map.put(start,map.get(start)+1);
map.put(end,map.get(end)-1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值