给定不同大象的寿命,找出最大大象数量的时期
Posted
技术标签:
【中文标题】给定不同大象的寿命,找出最大大象数量的时期【英文标题】:Given the life time of different elephants, find the period when maximum number of elephants lived 【发布时间】:2012-09-11 01:59:54 【问题描述】:我遇到了一个面试问题:
“给定不同大象的寿命。找出最大数量的大象活着的时期。”例如:
输入:[5, 10]
、[6, 15]
、[2, 7]
输出:[6,7]
(3 头大象)
我想知道这个问题是否与'n'个字符串的最长子字符串问题有关,这样每个字符串都代表一个时间段的连续范围。
例如:
[5,10] <=> 5 6 7 8 9 10
如果没有,什么可以很好地解决这个问题?我想用 C++ 编写代码。
任何帮助将不胜感激。
【问题讨论】:
这里有一个提示:画出实数线,并在上面标出大象的“生命线”。请注意,您只关心哪些点打开了一个区间,哪些点关闭了一个区间,以及它们的顺序。 【参考方案1】:我会做两个数组,一个是大象出生的时候,一个是大象死的时候。对两个数组进行排序。
现在保留一个计数器(最初为零)。开始遍历两个数组并不断从两个数组中获取最小元素。如果我们从 start 数组中获取一个元素,则递增 counter ,否则递减 counter。通过这种方法,我们可以很容易地找到最大值和时间。
【讨论】:
【参考方案2】:从您的输入中,我发现所有时间段都是重叠的,那么在这种情况下,解决方案很简单
我们被指定为 [start end]
所以答案将是所有开始的最大值和所有结束的最小值。
只需遍历每个时间段,找到所有开始的最大值和所有结束的最小值
注意:当所有时间段都超过一圈时,此解决方案适用
在你的例子中 所有输入的最大值 = 6 所有输出的最小值= 7
【讨论】:
【参考方案3】:如果我是你在面试,我会创建一个std::array
,其中大象的最大age
,然后为每头大象增加元素数量,例如:
[5,10] <<
增加数组中索引5 to 10
的所有元素。
然后我会排序并找出最大的数字在哪里。
可以像map<int,int>
一样使用std::map
(第1 - 期,第2 - 大象数量)。默认排序。
我想知道你是否知道更好的解决方案?
【讨论】:
谢谢。这是处理重叠问题的巧妙技巧。该数组依次代表一个实数线形式,我们在其中标记时间段(通过元素的增量)。我正在尝试提出其他解决方案,但到目前为止,这似乎是最好的解决方案。【参考方案4】:为每头大象创建两个事件:大象出生,大象死亡。按日期对事件进行排序。现在浏览事件并计算有多少大象还活着;每次达到新的最大值时,记录开始日期,每次低于最大值时记录结束日期。
此解决方案不依赖于整数日期。
【讨论】:
【参考方案5】:这类似于检查括号是否丢失的程序。它还与日期范围重叠有关。这个主题在 *** 和其他地方被打死。这里是:
Determine Whether Two Date Ranges Overlap
我通过将所有开始/结束范围放在一个结构(或类)向量中然后对它们进行排序来实现这一点。然后你可以遍历向量并检测大象级别的转换。 (大象的数量——说明问题的有趣方式!)
【讨论】:
以上是关于给定不同大象的寿命,找出最大大象数量的时期的主要内容,如果未能解决你的问题,请参考以下文章