Minimum Number of Platforms in DSA C++ - Time & Space Complexity
We want to find out how the time needed to find the minimum number of train platforms grows as the number of trains increases.
Specifically, how the operations scale when checking train arrival and departure times.
Analyze the time complexity of the following code snippet.
// Given arrival and departure times of trains
// Find minimum platforms needed
int findPlatform(int arr[], int dep[], int n) {
sort(arr, arr + n);
sort(dep, dep + n);
int platform_needed = 1, result = 1;
int i = 1, j = 0;
while (i < n && j < n) {
if (arr[i] <= dep[j]) {
platform_needed++;
i++;
} else {
platform_needed--;
j++;
}
if (platform_needed > result)
result = platform_needed;
}
return result;
}
This code sorts arrival and departure times, then uses two pointers to count platforms needed as trains arrive and leave.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Sorting the arrival and departure arrays, and then traversing them with two pointers.
- How many times: Sorting takes about n log n steps; the while loop runs at most 2n times because each pointer moves through the arrays once.
As the number of trains (n) grows, sorting takes more time but grows slower than the number of trains squared.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 * log 10 ≈ 33 + 20 (traversal) = 53 |
| 100 | About 100 * log 100 ≈ 664 + 200 (traversal) = 864 |
| 1000 | About 1000 * log 1000 ≈ 9966 + 2000 (traversal) = 11966 |
Pattern observation: The sorting dominates and grows a bit faster than linearly, but the traversal grows linearly.
Time Complexity: O(n log n)
This means the time needed grows a bit faster than the number of trains, mainly because of sorting.
[X] Wrong: "The while loop alone makes this O(n²) because it has nested conditions."
[OK] Correct: The two pointers each move forward only once through the arrays, so the loop runs at most 2n times, not n squared.
Understanding this time complexity helps you explain how sorting and linear scanning work together efficiently in real problems.
"What if the arrival and departure times were already sorted? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem goal
The problem asks for the minimum platforms so that no train waits due to platform unavailability.Step 2: Clarify what is being counted
We count platforms needed to handle overlapping train schedules without delay.Final Answer:
The least number of train platforms needed so no train waits -> Option CQuick Check:
Minimum platforms = no waiting trains [OK]
- Confusing total trains with platforms needed
- Ignoring overlapping arrival and departure times
- Thinking about train speed or distance
Solution
Step 1: Check correct vector syntax in C++
Vectors must be declared with type inside angle brackets and variable names, e.g., vector<int> arrival;Step 2: Identify valid declarations
vector<int> arrival; vector<int> departure; uses correct syntax for two separate vectors: vector<int> arrival; vector<int> departure;Final Answer:
vector<int> arrival; vector<int> departure; -> Option AQuick Check:
Correct vector syntax = vector<int> arrival; vector<int> departure; [OK]
- Missing angle brackets <> for vector type
- Incorrect order of type and variable name
- Using wrong syntax like vector arrival(int)
std::vector<int> arrival = {900, 940, 950, 1100, 1500, 1800};
std::vector<int> departure = {910, 1200, 1120, 1130, 1900, 2000};
int platforms = 1, result = 1;
int i = 1, j = 0;
while (i < arrival.size() && j < departure.size()) {
if (arrival[i] <= departure[j]) {
platforms++;
i++;
} else {
platforms--;
j++;
}
if (platforms > result) result = platforms;
}
std::cout << result << std::endl;What is the output of this code?
Solution
Step 1: Trace arrival and departure comparisons
Compare arrival[i] and departure[j]: - i=1(940) <= j=0(910)? No, so platforms-- (1->0), j=1 - i=1(940) <= j=1(1200)? Yes, platforms++ (0->1), i=2 - i=2(950) <= j=1(1200)? Yes, platforms++ (1->2), i=3 - i=3(1100) <= j=1(1200)? Yes, platforms++ (2->3), i=4 - i=4(1500) <= j=1(1200)? No, platforms-- (3->2), j=2 - i=4(1500) <= j=2(1120)? No, platforms-- (2->1), j=3 - i=4(1500) <= j=3(1130)? No, platforms-- (1->0), j=4 - i=4(1500) <= j=4(1900)? Yes, platforms++ (0->1), i=5 - i=5(1800) <= j=4(1900)? Yes, platforms++ (1->2), i=6 (end)Step 2: Find maximum platforms during process
Maximum platforms reached is 3 during the steps.Final Answer:
3 -> Option BQuick Check:
Max overlapping trains = 3 [OK]
- Not updating platform count correctly
- Mixing up arrival and departure indices
- Assuming max platforms equals total trains
std::vector<int> arrival = {900, 940, 950, 1100};
std::vector<int> departure = {910, 1120, 1130, 1200};
int platforms = 1, result = 1;
int i = 1, j = 0;
while (i < arrival.size() && j < departure.size()) {
if (arrival[i] < departure[j]) {
platforms++;
i++;
} else {
platforms--;
j++;
}
if (platforms > result) result = platforms;
}
std::cout << result << std::endl;Solution
Step 1: Analyze the if condition for arrival and departure
The condition uses arrival[i] < departure[j], but trains arriving exactly when another departs need a platform, so <= is correct.Step 2: Understand impact of using < instead of <=
Using < misses cases where arrival equals departure, causing undercount of platforms needed.Final Answer:
The comparison should be <= instead of < in if condition -> Option AQuick Check:
Use <= to count overlapping trains correctly [OK]
- Using < instead of <= causes wrong platform count
- Not sorting arrival and departure arrays
- Incorrect loop condition with && vs ||
Arrival: {1000, 1010, 1025, 1030, 1040}
Departure: {1015, 1020, 1035, 1045, 1050}What is the minimum number of platforms required so that no train waits? Choose the correct approach and answer.
Solution
Step 1: Sort arrival and departure times
Both arrays are already sorted: arrival = {1000,1010,1025,1030,1040}, departure = {1015,1020,1035,1045,1050}Step 2: Use two pointers to count overlapping trains
Compare arrival[i] and departure[j]: - 1010 <= 1015: platforms=2 - 1025 <= 1015? No, platforms=1 - 1025 <= 1020? No, platforms=0 - 1025 <= 1035? Yes, platforms=1 - 1030 <= 1035? Yes, platforms=2 - 1040 <= 1035? No, platforms=1 - 1040 <= 1045? Yes, platforms=2 Maximum platforms needed = 2 during overlaps.Final Answer:
Sort both arrays, then use two pointers to count overlaps; answer is 2 -> Option DQuick Check:
Two pointer overlap count = 2 platforms [OK]
- Counting total trains instead of overlaps
- Not sorting both arrays
- Using incorrect data structures like hash maps unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
