关于c ++:考虑到不同大象的生命时间,找到最大数量的大象生活的时期


Given the life time of different elephants, find the period when maximum number of elephants lived

我遇到了一个面试问题:

"考虑到不同大象的生命时间。找出最大数量的大象活着的时期。" 例如:
输入:[5, 10][6, 15][2, 7]
输出:[6,7](3头大象)

我想知道这个问题是否与'n'个字符串的最长子字符串问题有关,这样每个字符串代表一个时间段的连续范围。

例如:
[5,10] <=> 5 6 7 8 9 10

如果没有,那么这个问题的解决方案是什么? 我想用C ++编写代码。

任何帮助将不胜感激。


对于每只大象,创造两个事件:大象出生,大象死亡。按日期对事件排序。现在,您可以浏览这些活动,并了解有多少大象活着;每次达到新的最大值时,记录开始日期,每次从最大记录下降结束日期。

此解决方案不依赖于整数日期。


如果我是你在采访中我将创建一个std::array,其中最大age的大象,然后增加每个大象的元素数量,如:

[5,10] <<递增数组中索引5 to 10的所有元素。

然后我会排序并找到最大的数字。

有可能使用std::mapmap(第1期,第2期 - 大象数)。它将默认排序。

我想知道你是否知道更好的解决方案?


从您的输入中我发现所有时间段都是重叠的,那么在这种情况下解决方案很简单

我们被给予范围作为[开始结束]

所以答案将是所有开始和最小的所有结束的最大值。

只需遍历每个时间段,找到所有结束的所有开始和最大值的最大值

注意:此解决方案适用于所有时间段

在你的例子中
所有输入的最大值= 6
所有输出的最小值= 7


这类似于检查是否缺少括号的程序。它还与日期范围重叠有关。这个主题在StackOverflow和其他地方被打死。这里是:

确定两个日期范围是否重叠

我已经通过将所有开始/结束范围放在一个结构(或类)向量中然后对它们进行排序来实现这一点。然后你可以浏览矢量并检测大象水平的过渡。 (大象的数量 - 说明问题的有趣方式!)