1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#![allow(dead_code)] #[derive(Debug, PartialEq, Eq)] pub struct Interval { pub start: i32, pub end: i32, } impl Interval { #[inline] pub fn new(start: i32, end: i32) -> Self { Interval { start, end } } } pub fn interval_intersection(a: Vec<Interval>, b: Vec<Interval>) -> Vec<Interval> { let mut res = vec![]; for i in 0..a.len() { for j in 0..b.len() { if a[i].start > b[j].end || a[i].end < b[j].start { continue; } let start = a[i].start.max(b[j].start); let end = a[i].end.min(b[j].end); res.push(Interval::new(start, end)); } } res } #[cfg(test)] mod tests { use super::*; #[test] fn test1() { let a = vec![ Interval::new(0, 2), Interval::new(5, 10), Interval::new(13, 23), Interval::new(24, 25), ]; let b = vec![ Interval::new(1, 5), Interval::new(8, 12), Interval::new(15, 24), Interval::new(25, 26), ]; let c = vec![ Interval::new(1, 2), Interval::new(5, 5), Interval::new(8, 10), Interval::new(15, 23), Interval::new(24, 24), Interval::new(25, 25), ]; assert_eq!(interval_intersection(a, b), c); } }