有一个非常著名的问题。我在这里也是一样。 给出了大象数量的时间跨度,这里的时间跨度是指出生年份到死亡年份。 您必须计算最大数量的大象还活着的时期。
例:
1990 - 2013 1995 - 2000 2010 - 2020 1992 - 1999 Answer is 1995 - 1999
我已尽力解决此问题,但无法解决。
我怎么解决这个问题?
当用户要求查找任何一年中大象的数量时,我得到了解决方法。我使用段树解决了这个问题,只要给定任何大象的时间跨度,该时间跨度的每一年都将增加1。我们可以通过这种方式来解决。可以用来解决上述问题吗?
对于上述问题,我只需要高级方法,我自己编写代码。
将每个日期范围划分为开始日期和结束日期。
排序日期。如果开始日期和结束日期相同,则将结束日期放在第一位(否则您可能会得到一个空的日期范围作为最佳日期)。
从0开始计数。
使用扫描线算法遍历日期:
如果您有开始日期:
递增计数。
如果当前计数高于最近的最佳计数,请设置计数,存储此开始日期并设置标志。
如果您获得结束日期:
如果设置了该标志,则将存储的开始日期和此结束日期与计数保存为迄今为止的最佳间隔。
重置标志。
减少计数。
输入:
1990 - 2013 1995 - 2000 2010 - 2020 1992 - 1999
拆分和排序:(S=开始,E=结束)
S
E
1990 S, 1992 S, 1995 S, 1999 E, 2000 E, 2010 S, 2013 E, 2020 E
遍历它们:
count = 0 lastStart = N/A 1990: count = 1 count = 1 > 0, so set flag and lastStart = 1990 1992: count = 2 count = 2 > 0, so set flag and lastStart = 1992 1995: count = 3 count = 3 > 0, so set flag and lastStart = 1995 1999: flag is set, so record [lastStart (= 1995), 1999] with a count of 3 reset flag count = 2 2000: flag is not set reset flag count = 1 2010: count = 2 since count = 2 < 3, don't set flag 2013: flag is not set reset flag count = 1 2020: flag is not set reset flag count = 0