Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 2379. Minimum Recolors to Get K Consecutive Black Blocks.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½Π° ΡΡΡΠΎΠΊΠ° blocks
, ΡΠΎΡΡΠΎΡΡΠ°Ρ ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² 'W'
(Π±Π΅Π»ΡΠΉ) ΠΈ 'B'
(ΡΡΡΠ½ΡΠΉ).
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠΉ Π±Π΅Π»ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² Π² ΡΡΡΠ½ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ
ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ· k ΠΏΠΎΠ΄ΡΡΠ΄ ΠΈΠ΄ΡΡΠΈΡ
ΡΡΡΠ½ΡΡ
Π±Π»ΠΎΠΊΠΎΠ².
π‘ ΠΠ΄Π΅Ρ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅Ρ
Π½ΠΈΠΊΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°:
- Π±ΡΠ΄Π΅ΠΌ Π΄Π²ΠΈΠ³Π°ΡΡ ΠΎΠΊΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°
k
ΠΏΠΎ ΡΡΡΠΎΠΊΠ΅ ΠΈ ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π΅Π»ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² Π²Π½ΡΡΡΠΈ ΠΎΠΊΠ½Π°;
- ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π΅Π»ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² ΡΡΠ΅Π΄ΠΈ Π²ΡΠ΅Ρ
ΠΎΠΊΠΎΠ½ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠΎΠΌ.
π ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- ΠΠΎΡΡΠΈΡΠ°Π΅ΠΌ ΡΠΈΡΠ»ΠΎ Π±Π΅Π»ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°
k
.
- Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ Π²ΠΏΡΠ°Π²ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» Π·Π° ΡΠ°Π·:
- Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡΠΎΡΡΠΉ Β«Π²Ρ
ΠΎΠ΄ΠΈΡΒ» Π² ΠΎΠΊΠ½ΠΎ, Π±Π΅Π»ΡΠΉ (
'W'
), ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΡΡΡΠΈΠΊ;
- Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡΠΎΡΡΠΉ Β«Π²ΡΡ
ΠΎΠ΄ΠΈΡΒ» ΠΈΠ· ΠΎΠΊΠ½Π°, Π±Π΅Π»ΡΠΉ, ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΡΡΡΡΡΠΈΠΊ.
- ΠΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΄Π²ΠΈΠ³Π° ΠΎΠΊΠ½Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
- ΠΡΠΎΠ³ΠΎΠ²ΡΠΉ ΠΎΡΠ²Π΅Ρ β ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±Π΅Π»ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² Π·Π° Π²ΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΠ±Ρ
ΠΎΠ΄Π°.
β³ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΡ:
O(n)
β ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ
ΡΠ°Π·.
- ΠΠ°ΠΌΡΡΡ:
O(1)
β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ.
π οΈ ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn minimum_recolors(blocks: String, k: i32) -> i32 {
let blocks = blocks.as_bytes();
let k = k as usize;
// Count white blocks ('W') in the first window of size k
let initial_recolors = blocks[..k].iter().filter(|&&b| b == b'W').count() as i32;
// Slide window over the blocks using iterator methods
blocks
.windows(k+1)
.fold((initial_recolors, initial_recolors), |(current, min), window| {
// Update recolors based on outgoing and incoming blocks
let next = current
+ (window.last() == Some(&b'W')) as i32
- (window.first() == Some(&b'W')) as i32;
(next, min.min(next))
}).1
}
}
Tags: #rust #algorithms #counting