给定不同大象的寿命,找出最大大象数量的时期

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

我通过将所有开始/结束范围放在一个结构(或类)向量中然后对它们进行排序来实现这一点。然后你可以遍历向量并检测大象级别的转换。 (大象的数量——说明问题的有趣方式!)

【讨论】:

以上是关于给定不同大象的寿命,找出最大大象数量的时期的主要内容,如果未能解决你的问题,请参考以下文章

给定 3 个正整数,求最大步数将它们减少到 0

CodeChef Little Elephant and Mouses [DP]

大象朋友故事1——EVP Sambo&Ruby

大象中原

大象喝水

把大象装进冰箱:HTTP传输大文件的方法