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?