Problem 1024: Video Stitching
This commit is contained in:
commit
cd8655989a
4 changed files with 116 additions and 0 deletions
1
video-stitching/.gitignore
vendored
Normal file
1
video-stitching/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/target
|
7
video-stitching/Cargo.lock
generated
Normal file
7
video-stitching/Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "video-stitching"
|
||||
version = "0.1.0"
|
8
video-stitching/Cargo.toml
Normal file
8
video-stitching/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "video-stitching"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
100
video-stitching/src/main.rs
Normal file
100
video-stitching/src/main.rs
Normal file
|
@ -0,0 +1,100 @@
|
|||
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);
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue