一尘不染

查找具有最大重叠间隔数的时间段

algorithm

有一个非常著名的问题。我在这里也是一样。
给出了大象数量的时间跨度,这里的时间跨度是指出生年份到死亡年份。
您必须计算最大数量的大象还活着的时期。

例:

1990 - 2013
1995 - 2000
2010 - 2020
1992 - 1999

Answer is   1995 - 1999

我已尽力解决此问题,但无法解决。

我怎么解决这个问题?

当用户要求查找任何一年中大象的数量时,我得到了解决方法。我使用段树解决了这个问题,只要给定任何大象的时间跨度,该时间跨度的每一年都将增加1。我们可以通过这种方式来解决。可以用来解决上述问题吗?

对于上述问题,我只需要高级方法,我自己编写代码。


阅读 267

收藏
2020-07-28

共1个答案

一尘不染

  • 将每个日期范围划分为开始日期和结束日期。

  • 排序日期。如果开始日期和结束日期相同,则将结束日期放在第一位(否则您可能会得到一个空的日期范围作为最佳日期)。

  • 从0开始计数。

  • 使用扫描线算法遍历日期:

    • 如果您有开始日期:

    • 递增计数。

    • 如果当前计数高于最近的最佳计数,请设置计数,存储此开始日期并设置标志。

    • 如果您获得结束日期:

    • 如果设置了该标志,则将存储的开始日期和此结束日期与计数保存为迄今为止的最佳间隔。

    • 重置标志。

    • 减少计数。

例:

输入:

1990 - 2013
1995 - 2000
2010 - 2020
1992 - 1999

拆分和排序:(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
2020-07-28