考虑到到达火车站的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/
我为这个问题尝试了贪心算法,但它并不适用于所有测试用例。
答案 0 :(得分:1)
我想我之前误解了这个问题。 如果我们的平台数量有限,我现在认为我们要求取消最少数量的列车,以便时间表永远不会超过平台。
蛮力:
请注意,通过取消平台上剩余时间最长的火车站,我们取消了最低列车数量。我们必须在车站取消一列火车以释放一个平台,剩下最多时间的火车最大限度地为未来的抵达提供空间。
在最坏的情况下,如果到达和离开被分类并且可以快速地混合在一起,这将是O(N * K)复杂度。我注意到给出的例子几乎就是这样。
复杂性是排序和O(N * K)统计的最坏情况。
答案 1 :(得分:1)
在我看来(我没有严格的证明)贪婪的算法应该有效:
按出发时间对列车进行分类。
让我们维护一个大小为lastDeparture
的数组k
,其中lastDeparture[i]
是最后一列火车离开i
平台的时间(最初填充零) )。
让我们遍历列车阵列并执行以下操作:
找到lastDeparture[i] <= currentTrain.arrival
。
如果没有此类平台,请继续。
否则,请选择lastDeparture
值最大的那个(如果有多个此类平台,我们可以选择其中任何一个)。
将答案增加一个并将当前列车添加到此平台(即分配lastDeparture[i] = currentTrain.departure
。
证明草图:
让我们假设我们的解决方案不是最优的。让我们找到我们答案中的第一列火车,但不是最佳列车。应该有一些其他火车而不是它。但它的出发时间更长。因此,当我们交换这两列火车时总数不能增加。
时间复杂度: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)
因为排序,因为每列火车最多进入/离开一次。