📖 Scenario: You are working on a calendar app that needs to combine overlapping meeting times into single blocks to avoid confusion.
🎯 Goal: Build a program that merges overlapping intervals from a list of meeting times.
📋 What You'll Learn
Create a list of intervals with exact start and end times
Sort the intervals by their start time
Merge intervals that overlap
Print the merged intervals in the format [start, end]
💡 Why This Matters
🌍 Real World
Merging overlapping intervals is useful in calendar apps, booking systems, and timeline visualizations to avoid double bookings or overlapping events.
💼 Career
Understanding interval merging helps in software development roles involving scheduling, data processing, and optimization problems.
Progress0 / 4 steps
1
Create the list of intervals
Create a list of integer arrays called intervals with these exact intervals: [1, 3], [2, 6], [8, 10], [15, 18].
DSA C#
Hint
Use List<int[]> and add the exact intervals inside curly braces.
2
Sort the intervals by start time
Add a line to sort the intervals list by the first element of each interval using intervals.Sort((a, b) => a[0].CompareTo(b[0])).
DSA C#
Hint
Use the Sort method with a lambda to compare the first element of each interval.
3
Merge overlapping intervals
Create a new list called merged. Use a foreach loop with variable interval to iterate over intervals. Inside the loop, if merged is empty or the last interval in merged ends before interval starts, add interval to merged. Otherwise, update the end of the last interval in merged to the maximum of its current end and interval's end.
DSA C#
Hint
Use a list to store merged intervals and update the end time when intervals overlap.
4
Print the merged intervals
Use a foreach loop with variable interval to iterate over merged. Inside the loop, print each interval in the format [start, end] using Console.WriteLine.
DSA C#
Hint
Use a foreach loop and Console.WriteLine with string interpolation to print intervals.
Practice
(1/5)
1. What is the main purpose of the Merge Overlapping Intervals algorithm?
easy
A. To find the maximum number of intervals
B. To sort intervals by their length
C. To combine all intervals that overlap into a single continuous interval
D. To split intervals into smaller parts
Solution
Step 1: Understand the problem goal
The algorithm aims to merge intervals that share common parts so they become one continuous interval.
Step 2: Identify the correct purpose
Among the options, only combining overlapping intervals matches the goal.
Final Answer:
To combine all intervals that overlap into a single continuous interval -> Option C
Hint: Think of joining overlapping time slots into one [OK]
Common Mistakes:
Confusing merging with sorting
Thinking it splits intervals instead of combining
Assuming it counts intervals
2. Which of the following C# code snippets correctly sorts a list of intervals by their start time before merging?
easy
A. intervals.OrderBy(x => x.Length);
B. intervals.OrderByDescending(x => x.End);
C. intervals.Sort((a, b) => b.Start.CompareTo(a.Start));
D. intervals.Sort((a, b) => a.Start.CompareTo(b.Start));
Solution
Step 1: Identify sorting by start time
We need to sort intervals by their start property in ascending order.
Step 2: Check each option
intervals.Sort((a, b) => a.Start.CompareTo(b.Start)); uses Sort with CompareTo on Start ascending, which is correct. Others sort by end descending, start descending, or length, which are incorrect for merging.
Final Answer:
intervals.Sort((a, b) => a.Start.CompareTo(b.Start)); -> Option D
Quick Check:
Sort by start ascending = intervals.Sort((a, b) => a.Start.CompareTo(b.Start)); [OK]
Hint: Sort intervals by start ascending before merging [OK]
Common Mistakes:
Sorting by end time instead of start
Sorting descending instead of ascending
Sorting by interval length
3. What is the output of the following C# code that merges overlapping intervals?
var intervals = new List<(int Start, int End)>{ (1,3), (2,6), (8,10), (15,18) };
intervals.Sort((a,b) => a.Start.CompareTo(b.Start));
var merged = new List<(int, int)>();
foreach(var interval in intervals) {
if(merged.Count == 0 || merged[^1].End < interval.Start) {
merged.Add(interval);
} else {
var last = merged[^1];
merged[^1] = (last.Start, Math.Max(last.End, interval.End));
}
}
foreach(var i in merged) Console.Write($"({i.Start},{i.End}) ");
medium
A. (1,6) (8,10) (15,18)
B. (1,3) (2,6) (8,10) (15,18)
C. (1,10) (15,18)
D. (1,6) (2,10) (15,18)
Solution
Step 1: Sort intervals by start
Sorted intervals: (1,3), (2,6), (8,10), (15,18)
Step 2: Merge overlapping intervals
(1,3) and (2,6) overlap, merged to (1,6). Others do not overlap, so final merged list is (1,6), (8,10), (15,18).
Final Answer:
(1,6) (8,10) (15,18) -> Option A
Quick Check:
Merged intervals = (1,6) (8,10) (15,18) [OK]
Hint: Merge intervals by comparing current start with last merged end [OK]
Common Mistakes:
Not merging overlapping intervals
Merging intervals incorrectly by extending start
Printing original intervals without merging
4. The following code attempts to merge overlapping intervals but has a bug. What is the bug?
var intervals = new List<(int Start, int End)>{ (1,4), (4,5) };
intervals.Sort((a,b) => a.Start.CompareTo(b.Start));
var merged = new List<(int, int)>();
foreach(var interval in intervals) {
if(merged.Count == 0 || merged[^1].End <= interval.Start) {
merged.Add(interval);
} else {
var last = merged[^1];
merged[^1] = (last.Start, Math.Max(last.End, interval.End));
}
}
foreach(var i in merged) Console.Write($"({i.Start},{i.End}) ");
medium
A. The condition should use < instead of <= to merge touching intervals
B. The intervals are not sorted before merging
C. The merged list is not initialized
D. The code does not handle empty input
Solution
Step 1: Analyze the merge condition
The condition uses merged[^1].End <= interval.Start, which treats touching intervals as non-overlapping.
Step 2: Identify correct condition for merging
To merge intervals that touch (like (1,4) and (4,5)), use < instead of <= so they merge into (1,5).
Final Answer:
The condition should use < instead of <= to merge touching intervals -> Option A
Quick Check:
Use < to merge touching intervals [OK]
Hint: Use strict less than to merge intervals that touch [OK]
Common Mistakes:
Using <= causes touching intervals to not merge
Forgetting to sort intervals
Ignoring empty input cases
5. Given a list of intervals [(1,5), (2,3), (4,8), (10,12), (9,10)], what is the merged list after applying the merge overlapping intervals algorithm?