What if you could instantly see all your busy times combined without missing a single overlap?
Why Merge Overlapping Intervals in DSA Typescript?
Imagine you have a list of booked meeting times during a day, but some meetings overlap. You want to find the total free time. Doing this by checking each meeting against every other manually is confusing and slow.
Manually comparing each meeting with all others to find overlaps takes a lot of time and is easy to mess up. You might miss some overlaps or count the same time twice, leading to wrong free time calculations.
Merge Overlapping Intervals groups all overlapping meetings into one combined time slot. This way, you get a clear picture of busy times without confusion or double counting.
const meetings = [[1,3],[2,4],[5,7]]; // Manually check each pair for overlap and merge // Complex nested loops and conditions
const meetings = [[1,3],[2,4],[5,7]]; meetings.sort((a,b) => a[0] - b[0]); const merged = []; for (const interval of meetings) { if (!merged.length || merged[merged.length-1][1] < interval[0]) { merged.push(interval); } else { merged[merged.length-1][1] = Math.max(merged[merged.length-1][1], interval[1]); } }
This lets you quickly find combined busy times or free slots from many overlapping intervals, making scheduling and planning easy and error-free.
When booking rooms in an office, merging overlapping meeting times helps find when rooms are free without checking every single booking manually.
Manual overlap checks are slow and error-prone.
Merging intervals groups overlaps into clear combined slots.
This simplifies scheduling and time management tasks.
Practice
Solution
Step 1: Understand overlapping intervals
Overlapping intervals share some common range, so merging combines them into one continuous interval.Step 2: Purpose of merging
Merging removes overlaps by creating a single interval covering all overlapping parts.Final Answer:
To combine intervals that overlap into a single continuous interval -> Option DQuick Check:
Merging = Combine overlaps [OK]
- Thinking merging sorts intervals only
- Confusing merging with removing duplicates
- Believing merging splits intervals
Solution
Step 1: Identify sorting by start time
Sorting by start time means comparing the first element of each interval (a[0] and b[0]).Step 2: Check correct comparison function
Subtracting a[0] - b[0] sorts ascending by start time, which is correct.Final Answer:
intervals.sort((a, b) => a[0] - b[0]); -> Option AQuick Check:
Sort by start = a[0] - b[0] [OK]
- Sorting by end time instead of start time
- Adding values instead of subtracting in sort
- Using wrong indices for comparison
function mergeIntervals(intervals: number[][]): number[][] {
intervals.sort((a, b) => a[0] - b[0]);
const merged: number[][] = [];
for (const interval of intervals) {
if (!merged.length || merged[merged.length - 1][1] < interval[0]) {
merged.push(interval);
} else {
merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], interval[1]);
}
}
return merged;
}
console.log(mergeIntervals([[1,3],[2,6],[8,10],[15,18]]));Solution
Step 1: Sort intervals by start
Sorted intervals: [[1,3],[2,6],[8,10],[15,18]] (already sorted)Step 2: Merge overlapping intervals
First interval [1,3] added.
Second interval [2,6] overlaps with [1,3], merge to [1,6].
Third interval [8,10] no overlap, add.
Fourth interval [15,18] no overlap, add.Final Answer:
[[1,6],[8,10],[15,18]] -> Option CQuick Check:
Merged intervals = [[1,6],[8,10],[15,18]] [OK]
- Not sorting intervals before merging
- Overwriting intervals incorrectly
- Missing to merge overlapping intervals
function merge(intervals: number[][]): number[][] {
intervals.sort((a, b) => a[0] - b[0]);
const result: number[][] = [];
for (let i = 0; i < intervals.length; i++) {
if (result.length === 0 || result[result.length - 1][1] <= intervals[i][0]) {
result.push(intervals[i]);
} else {
result[result.length - 1][1] = Math.max(result[result.length - 1][1], intervals[i][1]);
}
}
return result;
}Solution
Step 1: Analyze overlap condition
Condition uses '<=' which treats touching intervals as non-overlapping.Step 2: Correct overlap detection
Correct condition uses '<' so that when last_end == current_start (touching), it merges since the if condition fails and goes to else. Current '<=' incorrectly pushes new for touching intervals.Final Answer:
The condition should use '<' instead of '<=' to detect overlap -> Option BQuick Check:
Overlap check needs '<' not '<=' [OK]
- Using '<=' causes missing merges on touching intervals
- Ignoring sorting requirement
- Not checking empty input but that is not the bug here
Choose the best approach.
Solution
Step 1: Track counts during merging
When merging intervals, keep a count for each merged interval starting at 1.Step 2: Increment count on overlap
Each time an interval merges into the last merged interval, increment its count to reflect how many intervals combined.Final Answer:
Keep a count alongside each merged interval and increment it when merging overlaps -> Option AQuick Check:
Count merges while merging intervals [OK]
- Sorting by end time does not help counting merges
- Counting after merging loses interval mapping
- Counting total merges instead of per merged interval
Ready to prove it?
Pass the test and this pattern moves unknown
