Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 2033. Minimum Operations to Make a Uni-Value Grid.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² grid
ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ m x n
, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΈΡΠ»ΠΎ x
.
ΠΠ° ΠΎΠ΄Π½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ±Π°Π²ΠΈΡΡ ΠΈΠ»ΠΈ Π²ΡΡΠ΅ΡΡΡ x
ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² grid
ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β Π²Π΅ΡΠ½ΡΡΡ -1
.
ΠΡΠΈΠΌΠ΅Ρ
- ΠΡ
ΠΎΠ΄:
grid = [[2,4],[6,8]]; x = 2
- ΠΡΡ
ΠΎΠ΄:
4
- ΠΠΎΡΡΠ½Π΅Π½ΠΈΠ΅: ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΊ 4 Π·Π° 4 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ

π‘ ΠΠ΄Π΅Ρ
- Π§ΡΠΎΠ±Ρ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠ°Π»ΠΈ ΡΠ°Π²Π½ΡΠΌΠΈ, ΠΈΡ
ΠΎΡΡΠ°ΡΠΊΠΈ ΠΏΡΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π°
x
Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ.
- ΠΠΎΡΠ»Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ Π·Π°Π΄Π°ΡΠ° ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΏΠΎΠΈΡΠΊΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
- ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΏΡΡΡΠΌ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΅Ρ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΎΠΏΠΎΡΠ½ΡΡ
Π²Π΅Π»ΠΈΡΠΈΠ½ Π² ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°ΡΡΡΡΠ° ΡΠΈΡΠ»Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΡΡΠΈΠΊΠΎΠ² Π±Π°Π»Π°Π½ΡΠ°.
ops = sum_balance β cells_balance β val

- ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠ΅Ρ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (
O(NΒ·log N)
), ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΡΡΠΈΠΊ ΡΠ°ΡΡΠΎΡ,
ΡΡΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π΄ΠΎ O(N + K)
.
βοΈ ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- Π‘ΡΡΠΎΠΈΠΌ ΡΠ°ΡΡΠΎΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΡΠΈΡΠ»Π° ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΠΎΡΡΠ°ΡΠΎΠΊ ΠΏΡΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π°
x
.
- ΠΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°, ΠΎΡΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊ
val / x
, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ Π²Π»ΠΈΡΠ½ΠΈΡ x
.
- ΠΠ°Ρ
ΠΎΠ΄ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΡΡΠ΅Π΄ΠΈ Π²ΡΡΡΠ΅ΡΠ°ΡΡΠΈΡ
ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²ΡΡΠ΅Π·Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ΅ΠΊΡΠΎΡ ΠΈΠ· Π²Π΅ΠΊΡΠΎΡΠ° ΡΠ°ΡΡΠΎΡ.
- ΠΡΠ΅ΠΌ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΠΎΠΏΠΎΡΠ½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ
- ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌ Π±Π°Π»Π°Π½ΡΠ½ΡΠ΅ ΡΡΡΡΡΠΈΠΊΠΈ, ΠΏΡΠΎΡ
ΠΎΠ΄Ρ ΠΏΠΎ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π² Π²Π΅ΠΊΡΠΎΡΠ΅ ΡΠ°ΡΡΠΎΡ.
- ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΏΠΎΠΎΡΠ΅ΡΡΠ΄Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΎΠΏΠΎΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ.
- ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
- ΠΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌΠΎΡΡΠΈ Π½Π΅ Π½Π°ΡΡΡΠ΅Π½Ρ β Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡΠ²Π΅Ρ.
- ΠΠ½Π°ΡΠ΅ β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ
-1
.
β³ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(N + K)
O(N)
β ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ counters_grid
(ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ).
O(K)
β ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΎΠΌΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ,
Π³Π΄Π΅ K β€ 10β΄ β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΡΠΊΠ΅.
- ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(K)
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ°ΡΡΠΎΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π²ΠΌΠ΅ΡΡΠΎ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΡΠΈΡΠ΅Π».
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn min_operations(grid: Vec<Vec<i32>>, x: i32) -> i32 {
let total_cells = grid.len() * grid[0].len();
// Get frequency counters for scaled values
let mut counters_grid = match Self::get_counters_grid(grid, x) {
Some(counters) => counters,
None => return -1, // Impossible to make all values equal
};
// Compute initial sum of differences
let mut sum_balance = counters_grid.iter()
.enumerate()
.map(|(value, &count)| value * count)
.sum::<usize>();
let mut cells_balance = total_cells;
let mut min_ops = sum_balance;
// Iterate over the frequency counter and adjust balances
counters_grid.into_iter()
.enumerate()
.map(|(value, count)| {
sum_balance -= 2 * value * count;
cells_balance -= 2 * count;
sum_balance - cells_balance * value
})
.min()
.unwrap() as _
}
// Converts a 2D grid into a frequency counter for scaled values.
// The transformation is impossible when at least two values in the grid have different remainders when divided by x.
// Returns None if transformation is impossible.
fn get_counters_grid(grid: Vec<Vec<i32>>, x: i32) -> Option<Vec<usize>> {
const MAX_INDEX: usize = 10_000; // Upper bound for value indices
let mut counters_grid = vec![0; MAX_INDEX + 1];
let mod_base = grid[0][0] % x;
let (mut min_index, mut max_index) = (MAX_INDEX, 0);
for row in grid {
for val in row {
if val % x != mod_base {
return None; // Impossible transformation
}
let index = (val / x) as usize;
max_index = max_index.max(index + 1);
min_index = min_index.min(index);
counters_grid[index] += 1;
}
}
// Trim the counters grid to the relevant range
Some(counters_grid[min_index..max_index].to_vec())
}
}
Tags: #rust #algorithms #optimization