How to merge overlapping ranges (start,end),(start,end) in Rust

1 Answer

0 votes
fn merge_ranges(mut ranges: Vec<(i32, i32)>) -> Vec<(i32, i32)> {
    // Sort by the start of each range
    ranges.sort_by_key(|r| r.0);

    let mut merged: Vec<(i32, i32)> = Vec::new();

    for (start, end) in ranges {
        if let Some((_, last_end)) = merged.last_mut() {
            if start <= *last_end {
                *last_end = (*last_end).max(end);
                continue;
            }
        }
        merged.push((start, end));
    }

    merged
}

fn main() {
    let ranges = vec![
        (302, 447),
        (488, 489),
        (121, 234),
        (200, 421),
        (140, 354),
    ];

    println!("{:?}", merge_ranges(ranges));
}



/*
run:

[(121, 447), (488, 489)]

*/

 



answered Jan 26 by avibootz
...