What if you could instantly clean up messy overlapping schedules with just a simple method?
Why Merge Overlapping Intervals in DSA Rust?
Imagine you have a list of booked meeting times in a day, but some meetings overlap. You want to find the total free time, but first, you need to merge these overlapping meetings into one continuous block.
Manually checking each meeting against every other to merge overlaps is slow and confusing. It's easy to miss overlaps or merge incorrectly, especially when many meetings overlap in complex ways.
Merge Overlapping Intervals sorts the meetings by start time, then combines any that overlap into one. This way, you get a clean list of non-overlapping intervals, making it easy to see free time or total booked time.
let intervals = vec![(1, 5), (3, 7), (8, 10)]; // Manually check and merge overlaps one by one
let intervals = vec![(1, 5), (3, 7), (8, 10)]; let merged = merge_intervals(intervals);
This lets you quickly and correctly combine overlapping time blocks, making scheduling and time management simple and error-free.
When booking rooms or resources, merging overlapping reservations helps avoid double-booking and shows exactly when the resource is busy.
Manual merging is slow and error-prone.
Sorting intervals first simplifies merging.
Merged intervals give a clear, non-overlapping schedule.
Practice
[[1,3],[2,6],[8,10]]?Solution
Step 1: Understand overlapping intervals
Intervals overlap if one starts before the other ends. For example, [1,3] and [2,6] overlap.Step 2: Merge overlapping intervals
We combine overlapping intervals into one that covers both, like merging [1,3] and [2,6] into [1,6].Final Answer:
Combine intervals that overlap into one continuous interval -> Option CQuick Check:
Merging overlapping intervals means combining them [OK]
- Sorting only by end values misses correct merges
- Removing intervals instead of merging
- Splitting intervals unnecessarily
Solution
Step 1: Identify sorting by start value
We want to sort intervals by their first element (start), so we usesort_by_keywithinterval[0].Step 2: Check sorting direction and key
intervals.sort_by_key(|interval| interval[0]); sorts ascending by start, which is correct. intervals.sort_by(|a, b| b[0].cmp(&a[0])); sorts descending, which is wrong. intervals.sort_by_key(|interval| interval[1]); sorts by end, not start.Final Answer:
intervals.sort_by_key(|interval| interval[0]); -> Option AQuick Check:
Sort by start value using sort_by_key(interval[0]) [OK]
- Sorting by end instead of start
- Sorting descending instead of ascending
- Using sort() without key for nested vectors
let mut intervals = vec![vec![1,4], vec![2,5], vec![7,9]];
intervals.sort_by_key(|x| x[0]);
let mut merged = vec![];
for interval in intervals {
if merged.is_empty() || merged.last().unwrap()[1] < interval[0] {
merged.push(interval);
} else {
let last = merged.last_mut().unwrap();
last[1] = last[1].max(interval[1]);
}
}
println!("{:?}", merged);Solution
Step 1: Sort intervals by start
Sorted intervals: [[1,4], [2,5], [7,9]] (already sorted).Step 2: Merge overlapping intervals
[1,4] and [2,5] overlap, merged to [1,5]. [7,9] does not overlap, so added as is.Final Answer:
[[1,5], [7,9]] -> Option DQuick Check:
Merged intervals = [[1,5], [7,9]] [OK]
- Not merging overlapping intervals
- Merging non-overlapping intervals
- Incorrectly updating interval ends
let mut intervals = vec![vec![1,3], vec![2,4], vec![5,7]];
intervals.sort_by_key(|x| x[1]);
let mut merged = vec![];
for interval in intervals {
if merged.is_empty() || merged.last().unwrap()[1] < interval[0] {
merged.push(interval);
} else {
let last = merged.last_mut().unwrap();
last[1] = last[1].max(interval[1]);
}
}
println!("{:?}", merged);Solution
Step 1: Check sorting key
The code sorts intervals by their end value, but merging requires sorting by start value to process intervals in order.Step 2: Effect of wrong sorting
Sorting by end causes intervals to be processed out of order, leading to missed merges or incorrect merges.Final Answer:
Sorting by end value causes incorrect merging -> Option AQuick Check:
Sort by start, not end, for correct merging [OK]
- Sorting by end instead of start
- Misusing mutable references
- Incorrect overlap condition
[[1,3],[2,4],[5,7],[6,8],[9,10]], write a Rust function to merge all overlapping intervals and return the merged list. What is the correct merged output?Solution
Step 1: Sort intervals by start
Sorted intervals: [[1,3],[2,4],[5,7],[6,8],[9,10]] (already sorted).Step 2: Merge overlapping intervals step-by-step
Merge [1,3] and [2,4] to [1,4]. Merge [5,7] and [6,8] to [5,8]. [9,10] stays separate.Final Answer:
[[1,4],[5,8],[9,10]] -> Option BQuick Check:
Merge intervals by extending ends where overlapping [OK]
- Not merging all overlapping intervals
- Merging non-overlapping intervals
- Incorrect final intervals after merge
Ready to prove it?
Pass the test and this pattern moves unknown
