k平台可以容纳的最大列车数量

时间:2015-02-24 20:12:30

标签: arrays algorithm data-structures dynamic-programming greedy

考虑到到达火车站的N列车的到达和离开时间,对于给定的k平台,返回我们可以在k平台上容纳的最大列车数量。

k <<< N

到达和离开时间数组

Input:  arr[]  = {9:00,  9:40, 9:50,  11:00, 15:00, 18:00}
        dep[]  = {9:10, 12:00, 11:20, 11:30, 19:00, 20:00}

在一些采访中我问过这个问题,那么最佳算法是什么?这个问题略有修改。

http://www.geeksforgeeks.org/minimum-number-platforms-required-railwaybus-station/

我为这个问题尝试了贪心算法,但它并不适用于所有测试用例。

3 个答案:

答案 0 :(得分:1)

我想我之前误解了这个问题。 如果我们的平台数量有限,我现在认为我们要求取消最少数量的列车,以便时间表永远不会超过平台。

蛮力:

  1. 合并&amp;对到达和离开进行排序(但要跟踪哪些是哪个,并确定哪列火车到达/离开)。
  2. 遍历数组,每次到达时为计数器添加一个,每次出发减去一个。
  3. 如果计数器为k并且火车到达,则在“溢出”到达时取消在平台上具有最长时间的火车。注意:这可能是到达的火车或已经在平台上的火车。
  4. 答案是列车总数减去取消列车的数量。
  5. 请注意,通过取消平台上剩余时间最长的火车站,我们取消了最低列车数量。我们必须在车站取消一列火车以释放一个平台,剩下最多时间的火车最大限度地为未来的抵达提供空间。

    在最坏的情况下,如果到达和离开被分类并且可以快速地混合在一起,这将是O(N * K)复杂度。我注意到给出的例子几乎就是这样。

    复杂性是排序和O(N * K)统计的最坏情况。

答案 1 :(得分:1)

在我看来(我没有严格的证明)贪婪的算法应该有效:

  1. 按出发时间对列车进行分类。

  2. 让我们维护一个大小为lastDeparture的数组k,其中lastDeparture[i]是最后一列火车离开i平台的时间(最初填充零) )。

  3. 让我们遍历列车阵列并执行以下操作:

    • 找到lastDeparture[i] <= currentTrain.arrival

    • 的所有此类平台
    • 如果没有此类平台,请继续。

    • 否则,请选择lastDeparture值最大的那个(如果有多个此类平台,我们可以选择其中任何一个)。

    • 将答案增加一个并将当前列车添加到此平台(即分配lastDeparture[i] = currentTrain.departure

  4. 证明草图:

    让我们假设我们的解决方案不是最优的。让我们找到我们答案中的第一列火车,但不是最佳列车。应该有一些其他火车而不是它。但它的出发时间更长。因此,当我们交换这两列火车时总数不能增加。

    时间复杂度:O(n log n)(可以使用平衡的二进制搜索树有效地处理步骤3,该搜索树使平台按照上次出发时间排序)。

答案 2 :(得分:-1)

如果我正确理解了这个问题,我相信这可以通过使用stack大小k来完成,其中包含当前在平台上的列车。对于每列火车(按出发时间排序):

while current.ArrivalTime > stack.Last.DepartureTime:
  remove the top element (train) from the stack
push the current train IF there is room, else ignore it
answer = max(answer, stack.Size)

堆栈达到的最大大小将是问题的答案。

这应该是O(n log n)因为排序,因为每列火车最多进入/离开一次。