Skip to content

Commit 7f20875

Browse files
authored
Create 2163_minimum_difference_in_sums_after_removal_of_lements.rs
1 parent 49fbed7 commit 7f20875

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use std::{cmp::Reverse, collections::BinaryHeap};
2+
3+
impl Solution {
4+
pub fn minimum_difference(nums: Vec<i32>) -> i64 {
5+
let n = nums.len() / 3;
6+
let mut min_prefix = vec![0i64; nums.len()];
7+
let mut max_suffix = vec![0i64; nums.len()];
8+
9+
let mut max_heap: BinaryHeap<i32> = BinaryHeap::new();
10+
let mut current_sum = 0i64;
11+
12+
for i in 0..nums.len() {
13+
if max_heap.len() < n {
14+
max_heap.push(nums[i]);
15+
current_sum += nums[i] as i64;
16+
} else if nums[i] < *max_heap.peek().unwrap() {
17+
current_sum -= max_heap.pop().unwrap() as i64;
18+
max_heap.push(nums[i]);
19+
current_sum += nums[i] as i64;
20+
}
21+
22+
if max_heap.len() == n {
23+
min_prefix[i] = current_sum;
24+
}
25+
}
26+
27+
let mut min_heap: BinaryHeap<Reverse<i32>> = BinaryHeap::new();
28+
current_sum = 0;
29+
30+
for i in (0..nums.len()).rev() {
31+
if min_heap.len() < n {
32+
min_heap.push(Reverse(nums[i]));
33+
current_sum += nums[i] as i64;
34+
} else if nums[i] > min_heap.peek().unwrap().0 {
35+
current_sum -= min_heap.pop().unwrap().0 as i64;
36+
min_heap.push(Reverse(nums[i]));
37+
current_sum += nums[i] as i64;
38+
}
39+
40+
if min_heap.len() == n {
41+
max_suffix[i] = current_sum;
42+
}
43+
}
44+
45+
let mut result = i64::MAX;
46+
for i in (n - 1)..(2 * n) {
47+
result = result.min(min_prefix[i] - max_suffix[i + 1]);
48+
}
49+
result
50+
}
51+
}

0 commit comments

Comments
 (0)