Skip to content

Commit db34baf

Browse files
committed
Add problem 2602: Minimum Operations to Make All Array Elements Equal
1 parent eeee0c7 commit db34baf

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,6 +1925,7 @@ pub mod problem_2596_check_knight_tour_configuration;
19251925
pub mod problem_2598_smallest_missing_non_negative_integer_after_operations;
19261926
pub mod problem_2600_k_items_with_the_maximum_sum;
19271927
pub mod problem_2601_prime_subtraction_operation;
1928+
pub mod problem_2602_minimum_operations_to_make_all_array_elements_equal;
19281929

19291930
#[cfg(test)]
19301931
mod test_utilities;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
pub mod prefix_sums_and_binary_search;
2+
3+
pub trait Solution {
4+
fn min_operations(nums: Vec<i32>, queries: Vec<i32>) -> Vec<i64>;
5+
}
6+
7+
#[cfg(test)]
8+
mod tests {
9+
use super::Solution;
10+
11+
pub fn run<S: Solution>() {
12+
let test_cases = [
13+
((&[3, 1, 6, 8] as &[_], &[1, 5] as &[_]), &[14_i64, 10] as &[_]),
14+
((&[2, 9, 6, 3], &[10]), &[20]),
15+
];
16+
17+
for ((nums, queries), expected) in test_cases {
18+
assert_eq!(S::min_operations(nums.to_vec(), queries.to_vec()), expected);
19+
}
20+
}
21+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
pub struct Solution;
2+
3+
// ------------------------------------------------------ snip ------------------------------------------------------ //
4+
5+
impl Solution {
6+
pub fn min_operations(nums: Vec<i32>, queries: Vec<i32>) -> Vec<i64> {
7+
let mut nums = nums.into_iter().map(|num| num as u32).collect::<Vec<_>>();
8+
let n = nums.len() as u64;
9+
10+
nums.sort_unstable();
11+
12+
let mut sum = 0;
13+
14+
let sums = nums
15+
.iter()
16+
.map(|&num| {
17+
sum += u64::from(num);
18+
19+
sum
20+
})
21+
.collect::<Box<_>>();
22+
23+
queries
24+
.into_iter()
25+
.map(|query| {
26+
let query = u64::from(query as u32);
27+
let index = nums.partition_point(|&num| num < query as u32);
28+
let left_sum = sums.get(index.wrapping_sub(1)).copied().unwrap_or(0);
29+
let index = index as u64;
30+
let left_operations = query * index - left_sum;
31+
let right_sum = sum - left_sum;
32+
let right_operations = right_sum - query * (n - index);
33+
34+
(left_operations + right_operations) as _
35+
})
36+
.collect()
37+
}
38+
}
39+
40+
// ------------------------------------------------------ snip ------------------------------------------------------ //
41+
42+
impl super::Solution for Solution {
43+
fn min_operations(nums: Vec<i32>, queries: Vec<i32>) -> Vec<i64> {
44+
Self::min_operations(nums, queries)
45+
}
46+
}
47+
48+
#[cfg(test)]
49+
mod tests {
50+
#[test]
51+
fn test_solution() {
52+
super::super::tests::run::<super::Solution>();
53+
}
54+
}

0 commit comments

Comments
 (0)