有一个非常着名的问题。我在这里问同样的问题。
有大象的时间跨度,这里的时间跨度意味着,出生年份到死亡年份
你必须计算最大数目的大象活着的时期。
示例:
1990 - 2013
1995 - 2000
2010 - 2020
1992 - 1999
Answer is 1995 - 1999
我努力解决这个问题,但我无法解决这个问题。
我该如何解决这个问题?
当用户要求在任何一年找到大象的数量时,我得到了方法。我通过使用分段树解决了这个问题,无论何时任何大象的时间跨度都给出,每年该时间跨度增加1.我们可以用这种方式解决这个问题。这可以用来解决上述问题吗?
对于上述问题,我只需要高级方法,我会自己编写代码。
答案 0 :(得分:8)
将每个日期范围拆分为开始日期和结束日期。
对日期排序。如果开始日期和结束日期相同,请将结束日期放在第一位(否则您可以获得最佳的空日期范围)。
从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
答案 1 :(得分:0)
这个怎么样?
说我将所有上述数据存储在一个文件中。将其读入由“ - ”分隔的两个数组中。
因此,现在我birthYear[]
包含所有出生年份,deathYear[]
包含所有死亡年份。
so birthYear [] = [1990,1995,2010,1992] deathYear [] = [2013,2000,2020,1999]
获得分娩年份和最大死亡年份。创建一个Hashtable,Key为一年,Value为count。
因此,
HashTable<String, Integer> numOfElephantsAlive = new HashTable<String, Integer>();
现在,从min(BirthYear)到max(BirthYear),执行以下操作:
迭代Birth Year Array并在BirthYear和Corresponding DeathYear之间的所有年份添加HashTable,计数为1.如果该键已经存在,请为其添加1。因此,对于最后一种情况:
1992 - 1999
HashTable.put(1992, 1)
HashTable.put(1993, 1)
and so on for every year.
Say, for example, you have a Hashtable that looks like this at the end of it:
Key Value
1995 3
1996 3
1992 2
1993 1
1994 3
1998 1
1997 2
1999 2
现在,当大象数量达到最大值时,您需要年龄范围。因此,让我们迭代并找到具有最大值的年份。这很简单。迭代keySet()并获得年份。
现在,你需要一个连续的年份。您可以通过两种方式执行此操作:
对keySet()执行Collections.sort(),当您达到最大值时,保存所有连续位置。
因此,在我们1994年的例子中点击3时,我们会用3来检查以下所有年份。这将返回你的范围,即最小年份,最大年份组合。
答案 2 :(得分:0)
可能有一种方法: 迭代这些时期。跟踪到目前为止的时间段列表。注意:在每个步骤中,周期数增加2(如果与现有周期列表没有重叠,则为1)。 例如
1990 - 2013
Period List contains 1 period { (1990,2013) }
Count List contains 1 entry { 1 }
1995 - 2000
Period List contains 3 periods { (1990,1995), (1995,2000), (2000,2013) }
Count List contains 3 entries { 1, 2, 1 }
2010 - 2020
Period List contains 5 periods { (1990,1995), (1995,2000), (2000,2010), (2010, 2013), (2013, 2020) }
Count List contains 5 entries { 1, 2, 1, 2, 1 }
1992 - 1999
Period List contains 7 periods { (1990,1992), (1992,1995), (1995,1999), (1999,2000), (2000,2010), (2010, 2013), (2013, 2020) }
Count List contains 7 entries { 1, 2, 3, 2, 1, 2, 1 }
答案 3 :(得分:0)
1)从最大的系列开始,按照年度排序。 2)计算整个数据集的最大系列的年份 3)然后确定最大的计数。 4)最大的数量是你多年来的答案......这可以在Algo中完成。