ΠΡΠ΅ΡΠ΅Π΄Π½Π°Ρ Π·Π°Π΄Π°ΡΠ°: 2290. Minimum Obstacle Removal to Reach Corner.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½Π° Π΄Π²ΡΠΌΠ΅ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° grid
ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ m x n
, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΊΠ»Π΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΡΠΎΠΉ (0
), Π»ΠΈΠ±ΠΎ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅ΠΌ (1
), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ. ΠΠ°Π΄Π°ΡΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΉΡΠΈ ΠΈΠ· Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° (0, 0)
Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡΠ°Π²ΡΠΉ ΡΠ³ΠΎΠ» (m-1, n-1)
, ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠ³Π°ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΏΡΡΡΡΠΌ ΠΊΠ»Π΅ΡΠΊΠ°ΠΌ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΡΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡ.
π ΠΠ΄Π΅Ρ
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠΎΠΈΡΠΊΠ° Π² ΡΠΈΡΠΈΠ½Ρ (BFS), ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡ. ΠΠΌΠ΅ΡΡΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π΅ΡΠΎΠΊ ΠΏΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ, ΠΊΠ°ΠΊ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ ΠΠ΅ΠΉΠΊΡΡΡΡ, Π² 0-1 BFS (ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠΈΠ½ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ) ΠΌΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΡΡΡΠ΅ ΠΊΠ»Π΅ΡΠΊΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΊΠ»Π΅ΡΠΊΠΈ Ρ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡΠΌΠΈ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΡ
ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ.
π ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
-
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ:
front
ΠΈ back
. ΠΠΎ front
ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ»Π΅ΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ Π±Π΅Π· ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ, Π° Π² back
β ΠΊΠ»Π΅ΡΠΊΠΈ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ
ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅.
-
ΠΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ (BFS):
- ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Ρ Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ³Π»Π° ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ Π²
0
(Ρ.Π΅. ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ Π΅ΡΠ΅ Π½Π΅ ΡΠ΄Π°Π»Π΅Π½ΠΎ).
- ΠΡΠ»ΠΈ ΠΊΠ»Π΅ΡΠΊΠ° ΠΏΡΡΡΠ°Ρ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
0
), ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Ρ Π² front
. ΠΡΠ»ΠΈ ΠΊΠ»Π΅ΡΠΊΠ° β ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠ΅ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1
), ΡΠΎ Π² back
.
- Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ BFS ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΊΠ»Π΅ΡΠΊΠΈ ΠΈΠ·
front
(Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ Π±Π΅Π· ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ), Π° Π΅ΡΠ»ΠΈ front
ΠΏΡΡΡ, ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ front
ΠΈ back
, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΊΠ»Π΅ΡΠΎΠΊ Ρ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡΠΌΠΈ.
-
ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ: ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (
Π²Π²Π΅ΡΡ
, Π²Π½ΠΈΠ·
, Π²Π»Π΅Π²ΠΎ
, Π²ΠΏΡΠ°Π²ΠΎ
) ΠΈ, Π΅ΡΠ»ΠΈ ΠΊΠ»Π΅ΡΠΊΠ° Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ
Π³ΡΠ°Π½ΠΈΡ ΠΈ ΠΏΡΡΡ ΠΊ Π½Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ Π΅Ρ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅.
-
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅: ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΡΠ³Π»Π°. ΠΠ΅Π»ΠΈΡΠΈΠ½Π° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ
ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ.
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ
-
π ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
- ΠΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ: ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠ»Π΅ΡΠΊΠ° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
- ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅) Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π°ΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ
O(1)
.
- ΠΡΠ΅Π³ΠΎ: ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΊΠ»Π΅ΡΠΊΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π΄Π΅ΠΊΠ°ΠΌΠΈ Π·Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° β
O(m * n)
, Π³Π΄Π΅ m
ΠΈ n
β ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΌΠ°ΡΡΠΈΡΡ.
-
π¦ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ:
- ΠΠ°ΡΡΠΈΠ² ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ: ΠΡ Ρ
ΡΠ°Π½ΠΈΠΌ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ»Π΅ΡΠΊΠΈ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ
O(m * n)
ΠΏΠ°ΠΌΡΡΠΈ.
- ΠΠ²e ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ: Π Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ±e ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΠ΅ ΠΊΠ»Π΅ΡΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΠΈΡ
Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ, ΡΠ°ΠΊΠΆΠ΅
O(m * n)
.
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΡ
impl Solution {
pub fn minimum_obstacles(grid: Vec<Vec<i32>>) -> i32 {
let rows = grid.len();
let cols = grid[0].len();
// Directions for moving up, down, left, and right
let directions = vec![
(-1, 0), (1, 0), (0, -1), (0, 1),
];
// Distance array initialized to a large value
let mut dist = vec![vec![i32::MAX; cols]; rows];
// Two deques: front and back (we'll use Vec as Queue backbone for efficient push and pop)
let mut front = Vec::new();
let mut back = Vec::new();
let mut front_idx = 0;
// Start from the top-left corner (cellId = (0, 0))
dist[0][0] = 0;
front.push((0, 0)); // Add the (row, col) tuple for the starting point
// Perform BFS
while !front.is_empty() {
while front_idx < front.len() {
// Pop from the front slice (get the (row, col) tuple)
let (row, col) = front.pop().unwrap();
for (dr, dc) in &directions {
let new_row = row + dr;
let new_col = col + dc;
// Check if the new position is within bounds
if new_row >= 0 && new_row < rows as i32 && new_col >= 0 && new_col < cols as i32 {
let new_row = new_row as usize;
let new_col = new_col as usize;
let new_dist = dist[row as usize][col as usize] + grid[new_row][new_col];
// Update distance if a better path is found
if new_dist < dist[new_row][new_col] {
dist[new_row][new_col] = new_dist;
if grid[new_row][new_col] == 0 {
// Empty cell: push to the front slice
front.push((new_row as i32, new_col as i32));
} else {
// Obstacle cell: push to the back slice
back.push((new_row as i32, new_col as i32));
}
}
}
}
}
// swap front and back
std::mem::swap(&mut front, &mut back);
}
// Return the distance to the bottom-right cell
dist[rows - 1][cols - 1]
}
}
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ Π²ΠΌΠ΅ΡΡΠΎ 2 ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 1 Π΄Π΅ΠΊ, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ ΠΏΡΡΠΈΡΡ Π»ΠΈΠ±ΠΎ Π² Π½Π°ΡΠ°Π»ΠΎ (0
), Π»ΠΈΠ±ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ (1
).