📖 Scenario: Imagine you are managing a small conference room booking system. Each booking has a start time and an end time. You want to understand how to work with these time intervals to find overlaps or free slots.
🎯 Goal: You will create a list of time intervals representing bookings, set a threshold time, filter intervals that start after this threshold, and finally print the filtered intervals.
📋 What You'll Learn
Create a vector of tuples called bookings with these exact intervals: (9, 10), (11, 12), (13, 14), (15, 16)
Create a variable called threshold and set it to 12
Use a for loop with variables start and end to iterate over bookings.iter() and collect intervals where start > threshold into a new vector called filtered_bookings
Print the filtered_bookings vector
💡 Why This Matters
🌍 Real World
Interval problems appear in scheduling, booking systems, and time management apps where you need to handle overlapping or sequential time slots.
💼 Career
Understanding intervals helps in software roles involving calendar apps, resource allocation, and event planning features.
Progress0 / 4 steps
1
Create the initial list of bookings
Create a vector called bookings with these exact tuples: (9, 10), (11, 12), (13, 14), (15, 16)
DSA Rust
Hint
Use let bookings = vec![(9, 10), (11, 12), (13, 14), (15, 16)]; to create the vector.
2
Set the threshold time
Create a variable called threshold and set it to 12
DSA Rust
Hint
Use let threshold = 12; to create the variable.
3
Filter bookings starting after the threshold
Use a for loop with variables start and end to iterate over bookings.iter() and collect intervals where start > threshold into a new vector called filtered_bookings
DSA Rust
Hint
Use a for loop with for &(start, end) in bookings.iter() and an if condition to check start > threshold.
4
Print the filtered bookings
Print the filtered_bookings vector using println!
DSA Rust
Hint
Use println!("{:?}", filtered_bookings); to print the vector.
Practice
(1/5)
1. Why are interval problems common in data structures and algorithms?
easy
A. Because intervals are easy to sort alphabetically
B. Because many real-world problems involve ranges or periods of time
C. Because intervals always have fixed lengths
D. Because intervals never overlap in practice
Solution
Step 1: Understand what intervals represent
Intervals represent ranges, such as time periods or numeric ranges, which appear often in scheduling, booking, or resource allocation problems.
Step 2: Recognize real-world relevance
Many practical problems require handling overlapping or merging intervals, making them a common pattern in algorithms.
Final Answer:
Because many real-world problems involve ranges or periods of time -> Option B
Quick Check:
Intervals = ranges in real life [OK]
Hint: Think about real-life ranges like meetings or bookings [OK]
Common Mistakes:
Assuming intervals always have fixed lengths
Thinking intervals never overlap
Confusing intervals with single points
2. Which Rust syntax correctly defines a struct to represent an interval with start and end as integers?
easy
A. struct Interval { start: i32, end: i32 }
B. struct Interval(start: i32, end: i32);
C. struct Interval { start i32; end i32 }
D. struct Interval = { start: i32, end: i32 }
Solution
Step 1: Recall Rust struct syntax
Rust structs use curly braces with field names and types separated by colons and commas.
Step 2: Check each option
struct Interval { start: i32, end: i32 } matches correct syntax: fields with colons and commas inside braces. Options A, C, and D have syntax errors.
Hint: Remember Rust structs use braces and colons for fields [OK]
Common Mistakes:
Using parentheses instead of braces
Missing colons between field names and types
Using equal sign instead of braces
3. What is the output of this Rust code that merges overlapping intervals?
fn merge_intervals(mut intervals: Vec<(i32, i32)>) -> Vec<(i32, i32)> {
intervals.sort_by_key(|k| k.0);
let mut merged = Vec::new();
for interval in intervals {
if let Some(last) = merged.last_mut() {
if interval.0 <= last.1 {
last.1 = last.1.max(interval.1);
} else {
merged.push(interval);
}
} else {
merged.push(interval);
}
}
merged
}
fn main() {
let intervals = vec![(1, 3), (2, 6), (8, 10), (15, 18)];
let result = merge_intervals(intervals);
println!("{:?}", result);
}
medium
A. [(1, 6), (2, 6), (8, 10), (15, 18)]
B. [(1, 3), (2, 6), (8, 10), (15, 18)]
C. [(1, 3), (8, 10), (15, 18)]
D. [(1, 6), (8, 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
First two intervals overlap (2 ≤ 3), merge 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 D
Quick Check:
Merged intervals = [(1,6), (8,10), (15,18)] [OK]
Hint: Sort intervals by start, then merge overlapping ones [OK]
Common Mistakes:
Not sorting intervals before merging
Pushing intervals without merging overlaps
Merging intervals incorrectly
4. Identify the bug in this Rust function that attempts to merge intervals:
fn merge(mut intervals: Vec<(i32, i32)>) -> Vec<(i32, i32)> {
intervals.sort_by_key(|k| k.1);
let mut merged = Vec::new();
for interval in intervals {
if let Some(last) = merged.last_mut() {
if interval.0 <= last.1 {
last.1 = last.1.max(interval.1);
} else {
merged.push(interval);
}
} else {
merged.push(interval);
}
}
merged
}
medium
A. Missing return statement at the end
B. Using max instead of min when merging intervals
C. Sorting intervals by end instead of start causes incorrect merging
D. Not initializing merged vector before loop
Solution
Step 1: Analyze sorting key
The function sorts intervals by their end value, but merging requires sorting by start to process intervals in order.
Step 2: Understand merging logic impact
Sorting by end breaks the assumption that intervals are processed from earliest start, causing incorrect merges.
Final Answer:
Sorting intervals by end instead of start causes incorrect merging -> Option C
Quick Check:
Sort by start, not end, for correct merging [OK]
Hint: Sort intervals by start, not end, before merging [OK]
Common Mistakes:
Sorting by wrong interval boundary
Confusing max and min when merging
Forgetting to push first interval
5. Given a list of intervals representing booked meeting times, how would you find the minimum number of meeting rooms required to hold all meetings without overlap?
Choose the best approach.
hard
A. Sort intervals by start time, use a min-heap to track earliest end time, allocate rooms accordingly
B. Sort intervals by end time, merge all overlapping intervals into one
C. Count total intervals and subtract overlapping pairs
D. Sort intervals by length and assign rooms based on shortest first
Solution
Step 1: Understand the problem
We need to find how many rooms are needed so no meetings overlap in the same room.
Step 2: Use sorting and min-heap
Sort intervals by start time. Use a min-heap to track the earliest finishing meeting. If a meeting starts after the earliest ends, reuse that room; else allocate a new room.
Final Answer:
Sort intervals by start time, use a min-heap to track earliest end time, allocate rooms accordingly -> Option A
Quick Check:
Min rooms = track earliest end with heap [OK]
Hint: Use min-heap on end times after sorting by start [OK]
Common Mistakes:
Merging intervals instead of counting overlaps
Sorting by length instead of start time
Ignoring the need to track multiple rooms
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.