Given the arrival and departure times of all trains that reach a railway station, find the minimum number of platforms required for the railway station so that no train waits. We are given two arrays that represent arrival and departure times of trains that stop.
Examples:
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}
Output: 3
There are at-most three trains at a time
(time between 11:00 to 11:20)
We have already discussed its simple and sorting based solutions in below post.
Minimum Number of Platforms Required for a Railway/Bus Station.
In this post, we are inserting all the arrival and departure times in a multiset. The first value of element in multiset tells the arrival/departure time and second value tells whether it’s arrival or departure represented by ‘a’ or ‘d’ respectively.
If its arrival then do increment by 1 otherwise decrease value by 1. If we are taking the input from STDIN then we can directly insert the times in the multiset and no need to store the times in the array.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int findPlatform( int arr[], int dep[], int n)
{
multiset<pair< int , char > > order;
for ( int i = 0; i < n; i++) {
order.insert(make_pair(arr[i], 'a' ));
order.insert(make_pair(dep[i], 'd' ));
}
int result = 0;
int plat_needed = 0;
for ( auto it : order) {
if (it.second == 'a' )
plat_needed++;
else
plat_needed--;
if (plat_needed > result)
result = plat_needed;
}
return result;
}
int main()
{
int arr[] = { 900, 940, 950, 1100, 1500, 1800 };
int dep[] = { 910, 1200, 1120, 1130, 1900, 2000 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Minimum Number of Platforms Required = "
<< findPlatform(arr, dep, n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class pair
{
int first;
char second;
pair( int key1, char key2)
{
this .first = key1;
this .second = key2;
}
}
class GFG{
public static int findPlatform( int arr[], int dep[],
int n)
{
ArrayList<pair> order = new ArrayList<>();
for ( int i = 0 ; i < n; i++)
{
order.add( new pair(arr[i], 'a' ));
order.add( new pair(dep[i], 'd' ));
}
Collections.sort(order, new Comparator<pair>()
{
public int compare(pair p1, pair p2)
{
if (p1.first == p2.first)
return new Character(p1.second)
.compareTo(
new Character(p2.second));
return p1.first - p2.first;
}
});
int result = 1 ;
int plat_needed = 0 ;
for ( int i = 0 ; i < order.size(); i++)
{
pair p = order.get(i);
if (p.second == 'a' )
plat_needed++;
else
plat_needed--;
if (plat_needed > result)
result = plat_needed;
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 900 , 940 , 950 , 1100 , 1500 , 1800 };
int dep[] = { 910 , 1200 , 1120 , 1130 , 1900 , 2000 };
int n = 6 ;
System.out.println( "Minimum Number of " +
"Platforms Required = " +
findPlatform(arr, dep, n));
}
}
|
Python3
def findPlatform(arr, dep, n):
times = []
for i in range (n):
times.append([dep[i], 'd' ])
times.append([arr[i], 'a' ])
times = sorted (times, key = lambda x: x[ 1 ])
times = sorted (times, key = lambda x: x[ 0 ])
result, plat_needed = 0 , 0
for i in range ( 2 * n):
if times[i][ 1 ] = = 'a' :
plat_needed + = 1
result = max (plat_needed, result)
else :
plat_needed - = 1
return result
arr = [ 900 , 940 , 950 , 1100 , 1500 , 1800 ]
dep = [ 910 , 1200 , 1120 , 1130 , 1900 , 2000 ]
n = len (arr)
print ( "Minimum Number of Platforms Required =" ,
findPlatform(arr, dep, n))
|
C#
using System;
using System.Collections.Generic;
public class pair {
public int first;
public char second;
public pair( int key1, char key2) {
this .first = key1;
this .second = key2;
}
}
public class GFG {
public static int findPlatform( int []arr, int []dep, int n) {
List<pair> order = new List<pair>();
for ( int i = 0; i < n; i++) {
order.Add( new pair(arr[i], 'a' ));
order.Add( new pair(dep[i], 'd' ));
}
order.Sort((p1,p2)=> p1.first == p2.first? p1.second -
p2.second: p1.first - p2.first);
int result = 1;
int plat_needed = 0;
for ( int i = 0; i < order.Count; i++) {
pair p = order[i];
if (p.second == 'a' )
plat_needed++;
else
plat_needed--;
if (plat_needed > result)
result = plat_needed;
}
return result;
}
public static void Main(String[] args) {
int []arr = { 900, 940, 950, 1100, 1500, 1800 };
int []dep = { 910, 1200, 1120, 1130, 1900, 2000 };
int n = 6;
Console.WriteLine( "Minimum Number of " +
"Platforms Required = " +
findPlatform(arr, dep, n));
}
}
|
Javascript
<script>
const findPlatform = (arr, dep, n) => {
let order = new Set();
for (let i = 0; i < n; i++) {
order.add([arr[i], 'a' ]);
order.add([dep[i], 'd' ]);
}
let result = 0;
let plat_needed = 0;
order = [...order];
order = order.sort((a, b) => a[0] - b[0])
for (let it in order) {
if (order[it][1] == 'a' )
plat_needed++;
else
plat_needed--;
if (plat_needed > result)
result = plat_needed;
}
return result;
}
let arr = [900, 940, 950, 1100, 1500, 1800];
let dep = [910, 1200, 1120, 1130, 1900, 2000];
let n = arr.length;
document.write(`Minimum Number of Platforms Required = ${findPlatform(arr, dep, n)}`);
</script>
|
OutputMinimum Number of Platforms Required = 3
Complexity Analysis:
- Time Complexity: O( N* LogN).
Since we are inserting into multiset and it maintain elements in sorted order. So N insert operations in multiset requires N*LogN time complexity.
We are using multiset which will have 2*N elements .
Using constant space and O(n) time complexity
All the trains will arrive and depart in only one day, i.e. a 24-hour time frame, hence we can use an array and for every arrival increase the value at that time (time in 24-hour format), and for every departure decrement the value at the index. In the array, every index denotes time in 24hr format and the sum of traversal up to that index is the number of platforms required, at that time.
Illustration:
arrivals – { 1200 , 1230 , 1240 , 1245}
departures – { 1210 , 1245 , 1250 , 1250}
make an array of size 2361 having 0 as the default value .
for the above example the array will have the following values – 1 ,-1 , 1 , -1 , 0 , -2
at indices – 1200 , 1210 , 1230 ,1240 ,1245,1250
Rest all indices have the default value of 0,in the above situation the number of platforms required at different times are –
platforms time
1 1200
2 1210
3 1230
2 1240
2 1245
1 1250
3 is the max so 3 is the answer
Approach:
Follow the below steps to solve the problem:
- Make an array for 24 hrs i.e. – 2361 size , named time.
- Now for every arrival increment the element at the index in the array time.
- For every departure decrement the element (default integer value in time is 0).
- Then traverse the entire array and keep adding the value at current index to a variable count.
- The max value of the variable count is the answer.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int minPlatform( int arrival[], int departure[], int n)
{
int platform[2361] = {0};
int requiredPlatform = 1;
for ( int i = 0; i < n; i++) {
++platform[arrival[i]];
--platform[departure[i] + 1];
}
for ( int i = 1; i < 2361; i++) {
platform[i] = platform[i] + platform[i - 1];
requiredPlatform = max(requiredPlatform, platform[i]);
}
return requiredPlatform;
}
int main()
{
int arr[] = { 900, 940, 950, 1100, 1500, 1800 };
int dep[] = { 910, 1200, 1120, 1130, 1900, 2000 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Minimum Number of Platforms Required = "
<< minPlatform(arr, dep, n);
return 0;
}
|
Java
import java.util.*;
import java.lang.*;
class GFG{
static int minPlatform( int arrival[],
int departure[],
int n)
{
int [] platform = new int [ 2361 ];
int requiredPlatform = 1 ;
for ( int i = 0 ; i < n; i++)
{
++platform[arrival[i]];
--platform[departure[i] + 1 ];
}
for ( int i = 1 ; i < 2361 ; i++)
{
platform[i] = platform[i] +
platform[i - 1 ];
requiredPlatform = Math.max(requiredPlatform,
platform[i]);
}
return requiredPlatform;
}
public static void main(String[] args)
{
int arr[] = { 900 , 940 , 950 , 1100 , 1500 , 1800 };
int dep[] = { 910 , 1200 , 1120 , 1130 , 1900 , 2000 };
int n = arr.length;
System.out.println( "Minimum Number of " +
"Platforms Required = " +
minPlatform(arr, dep, n));
}
}
|
Python3
def minPlatform(arrival, departure, n):
platform = [ 0 ] * 2361
requiredPlatform = 1
for i in range (n):
platform[arrival[i]] + = 1
platform[departure[i] + 1 ] - = 1
for i in range ( 1 , 2361 ):
platform[i] = platform[i] + platform[i - 1 ]
requiredPlatform = max (requiredPlatform,
platform[i])
return requiredPlatform
arr = [ 900 , 940 , 950 , 1100 , 1500 , 1800 ]
dep = [ 910 , 1200 , 1120 , 1130 , 1900 , 2000 ]
n = len (arr)
print ( "Minimum Number of Platforms Required = " ,
minPlatform(arr, dep, n))
|
C#
using System;
class GFG {
static int minPlatform( int [] arrival, int [] departure, int n)
{
int [] platform = new int [2361];
int requiredPlatform = 1;
for ( int i = 0; i < n; i++)
{
++platform[arrival[i]];
--platform[departure[i] + 1];
}
for ( int i = 1; i < 2361; i++)
{
platform[i] = platform[i] +
platform[i - 1];
requiredPlatform = Math.Max(requiredPlatform,
platform[i]);
}
return requiredPlatform;
}
static void Main() {
int [] arr = { 900, 940, 950, 1100, 1500, 1800 };
int [] dep = { 910, 1200, 1120, 1130, 1900, 2000 };
int n = arr.Length;
Console.Write( "Minimum Number of " +
"Platforms Required = " +
minPlatform(arr, dep, n));
}
}
|
Javascript
<script>
function minPlatform(arrival, departure, n) {
let platform = new Array(2361).fill(0);
let requiredPlatform = 1;
for (let i = 0; i < n; i++) {
++platform[arrival[i]];
--platform[departure[i] + 1];
}
for (let i = 1; i < 2361; i++) {
platform[i] =
platform[i] + platform[i - 1];
requiredPlatform =
Math.max(requiredPlatform, platform[i]);
}
return requiredPlatform;
}
let arr = [900, 940, 950, 1100, 1500, 1800];
let dep = [910, 1200, 1120, 1130, 1900, 2000];
let n = arr.length;
document.write( "Minimum Number of Platforms Required = "
+ minPlatform(arr, dep, n));
</script>
|
OutputMinimum Number of Platforms Required = 3
Complexity Analysis:
- Time Complexity: O(N).
- Space Complexity: O(1).
This article is contributed by Jatin Goyal and Abhinav Kumar Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.