问题描述
这是一个任务:
夏季花卉展览的策划人正在为活动做准备。他们必须找到一个最大的花朵盛开的时期。他们有一个包含(0 ID,开花季节的开始和结束(StartMonth,StartDay,EndMonth,EndDay) 帮助策展人找到展览最多花开的最早时间(间隔的开始和结束)。 注意:正确的时间不一定必须是已经存在的时间间隔 由于这是我自己要做的大部分工作,所以我想就如何从理论上解决此问题获得建议。 开花季节的样本: 121 6 15 7 25 102 7 1 8 14 236 6 30 8 31 141 7 31 8 10 111 7 1 7 20 128 6 2 6 3 首先,我将介绍我的方法: 现在考虑这个问题时,我脑海中浮现出一个想法,那就是我可以尝试构建一个92天的结构
然后计算出哪几天包含最多的开花季节。这将很容易,但是我对这种解决方案不满意,因为它效率太低。 (笑声)与我当前的代码相提并论,该代码一次又一次地匹配间隔。效率仍然低下吗? :D 我也一直在互联网上寻找答案,但是设法只找到了一半。 总而言之,我很想听听其他意见。有什么方法可以正确处理此问题?我的方法合理吗?还是我应该寻找另一种方法?您的帮助将不胜感激。再次,我不是要一个完整的解决方案,只是向答案轻推。预先感谢。
解决方法
通过增加日期对所有时间间隔进行排序,将它们的开始权重+1并结束权重-1。
现在按时间顺序扫描列表,同时添加点权重。每次,这都会给出不同的盛开花朵数量。您的情况是012345456 ... 0。
同时,使边界保持到目前为止的最高计数(如果是平局,则保持最早的值)。最高间隔的结尾就是下一个边界。
如果多个间隔同时开始或结束,请处理那些先结束的间隔,以避免零持续时间的解决方案。 (要实现这一点,就可以设计一个比较函数,使得在平局的情况下,-1为优先。)