From d5c9f5d384a1414b68c2a8a00a15e89a310f8a49 Mon Sep 17 00:00:00 2001 From: Jay <51136830+Jay-0331@users.noreply.github.com> Date: Mon, 13 Feb 2023 18:57:05 +0000 Subject: [PATCH] Create: 0621-task-scheduler.rs --- rust/0621-task-scheduler.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 rust/0621-task-scheduler.rs diff --git a/rust/0621-task-scheduler.rs b/rust/0621-task-scheduler.rs new file mode 100644 index 000000000..537dbd753 --- /dev/null +++ b/rust/0621-task-scheduler.rs @@ -0,0 +1,34 @@ +use std::collections::{BinaryHeap, VecDeque, HashMap}; + +impl Solution { + pub fn least_interval(tasks: Vec, n: i32) -> i32 { + let mut count = HashMap::new(); + let mut max_heap = BinaryHeap::new(); + for task in tasks { + let count = count.entry(task).or_insert(0); + *count += 1; + } + for (key, val) in count.iter() { + max_heap.push(*val); + } + let mut time = 0; + let mut deque: VecDeque<(i32,i32)> = VecDeque::new(); + while deque.len() > 0 || max_heap.len() > 0 { + time += 1; + + if max_heap.len() == 0 { + time = deque[0].1; + } + else { + let cnt = max_heap.pop().unwrap() - 1; + if cnt != 0 { + deque.push_back((cnt, time + n)); + } + } + if deque.len() > 0 && deque[0].1 == time { + max_heap.push(deque.pop_front().unwrap().0); + } + } + time + } +} \ No newline at end of file