fn video_stitching(clips: Vec>, time: i32) -> i32 { let mut arr = clips.clone(); arr.sort_by(|a, b| if a[0] == b[0] { b[1].cmp(&a[1]) } else { a[0].cmp(&b[0]) } ); if arr[0][0] != 0 { return -1; } let mut current_index = 0; let mut current_time = arr[0][1]; let mut count = 1; while current_time < time { let mut max: Option<&Vec> = None; let mut max_index: Option = None; for (index, slice) in arr.iter().enumerate() { if index <= current_index { continue; } if slice[0] > current_time { break; } if max.is_none() || slice[1] > max.unwrap()[1] { max = Some(slice); max_index = Some(index); } } if let (Some(slice), Some(index)) = (max, max_index) { current_time = slice[1]; current_index = index; count += 1; } else { return -1; } } count } fn main() { println!("{}", video_stitching(vec![vec![0,1]], 1)); } #[cfg(test)] mod tests { use super::*; #[test] fn test_simple() { let clips = vec![vec![0,1], vec![1,3], vec![3,7]]; assert_eq!(video_stitching(clips, 7), 3); } #[test] fn test_ex1() { let clips = vec![ vec![0,2], vec![4,6], vec![8,10], vec![1,9], vec![1,5], vec![5,9], ]; assert_eq!(video_stitching(clips, 10), 3); } #[test] fn test_ex2() { let clips = vec![vec![0,1], vec![1,2]]; assert_eq!(video_stitching(clips, 5), -1); } #[test] fn test_ex3() { let clips = vec![ vec![0,1], vec![6,8], vec![0,2], vec![5,6], vec![0,4], vec![0,3], vec![6,7], vec![1,3], vec![4,7], vec![1,4], vec![2,5], vec![2,6], vec![3,4], vec![4,5], vec![5,7], vec![6,9], ]; assert_eq!(video_stitching(clips, 9), 3); } #[test] fn test_n48() { let clips = vec![ vec![ 8,10], vec![17,39], vec![18,19], vec![ 8,16], vec![13,35], vec![33,39], vec![11,19], vec![18,35], ]; assert_eq!(video_stitching(clips, 20), -1); } }