Skip to content

Instantly share code, notes, and snippets.

@PopeFelix
Created August 30, 2024 22:30
Show Gist options
  • Select an option

  • Save PopeFelix/4541ed75e9ca7d01eb94252548cfb91d to your computer and use it in GitHub Desktop.

Select an option

Save PopeFelix/4541ed75e9ca7d01eb94252548cfb91d to your computer and use it in GitHub Desktop.
Build ranges of numbers in Rust
/// Takes a vector of closed intervals of the form [start, end], merges any invervals in which one interval
/// overlaps with another (i.e. at least one of the endpoints of one interval is contained within a second
/// interval), and returns a list of the merged intervals.
fn main() {
// sort ranges numerically
// Define a vector of ranges
let ranges = vec![[15, 18], [2, 6], [8, 10], [1, 3]];
// let ranges = vec![[1, 5], [2, 3], [4, 8], [9, 10], [9, 12]];
// Call merge_ranges function with the ranges
let merged = merge_ranges(ranges);
println!("Output: {:?}", merged);
// Expected output: [1, 6], [8, 10], [15, 18]
}
fn merge_ranges(ranges: Vec<[i32; 2]>) -> Vec<[i32; 2]> {
let mut merged = Vec::new();
let mut r2 = ranges.clone();
r2.sort_by(|a, b| a[0].cmp(&b[0]));
let mut count: i32 = 0;
let mut start: i32;
let mut end: i32;
let mut range: Vec<i32> = vec![];
// let last = r2.last();
let last = r2.len() as i32;
for element in r2 {
start = element[0];
end = element[1];
dbg!([start, end]);
if range.is_empty() {
range = vec![start, end];
} else {
let range_start = range[0];
let range_end = range[1];
if end > range_end {
if start <= range_end {
range[1] = end;
if start < range_start {
range[0] = start
}
} else {
// start > range_end
merged.push([range[0], range[1]]);
dbg!(&merged);
range = vec![start, end];
}
} else if end == range_end {
if start < range_start {
range[0] = start
}
} else {
// end < range_end
if end < range_start {
merged.push([range[0], range[1]]);
range = vec![start, end];
} else {
// end >= range_start
range[1] = end
}
}
}
count = count + 1;
if count == last {
merged.push([range[0], range[1]]);
}
dbg!(&range);
}
merged.sort_by(|a, b| a[0].cmp(&b[0]));
merged
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment