100 lines
2.3 KiB
Rust
100 lines
2.3 KiB
Rust
fn video_stitching(clips: Vec<Vec<i32>>, 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<i32>> = None;
|
|
let mut max_index: Option<usize> = 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);
|
|
}
|
|
}
|