Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 2342. Max Sum of a Pair With Equal Sum of Digits
π Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π» nums
. ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π΄Π²ΡΡ
ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΡ
ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π°Ρ ΡΡΠΌΠΌΠ° ΡΠΈΡΡ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΈΡ
ΠΏΠ°Ρ Π½Π΅Ρ β Π²Π΅ΡΠ½ΡΡΡ -1
.
π‘ ΠΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠΌΠ΅ΡΡΠΎ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΡΠΈΡΠ΅Π» Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΡΡΠΌΠΌΠΎΠΉ ΡΠΈΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ
.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈ Π²ΡΡΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Ρ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΡΠΌΠΌΠΎΠΉ ΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ°Π·Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π»ΠΈ ΠΎΠ½ΠΎ Π»ΡΡΡΡΡ ΠΏΠ°ΡΡ.
π ΠΠΎΠ΄Ρ
ΠΎΠ΄ ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΡ
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²
max_per_dsum
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ
ΡΠ°Π½ΠΈΠΌ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠΌΠΌΡ ΡΠΈΡΡ.
- ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡΠΌΠΌΠ° ΡΠΈΡΡ Π΄Π»Ρ i32 β 82, Π½ΠΎ ΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎΡΠ½Π΅ΠΉ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ.
- ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ
nums
Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ Ρ filter_map
:
- Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΡΠΌΠΌΡ ΡΠΈΡΡ
d_sum
Π΄Π»Ρ ΡΠΈΡΠ»Π° n
;
- Π΅ΡΠ»ΠΈ ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠΈΡΠ»ΠΎ Ρ ΡΠ°ΠΊΠΈΠΌ
d_sum
, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡΡ ΡΡΠΌΠΌΡ ΠΏΠ°ΡΡ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½Π½ΠΎΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ;
- Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Ρ Π΄Π°Π½Π½ΡΠΌ
d_sum
, ΠΏΡΠΎΡΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² max_per_dsum
;
filter_map
ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΡΡΠΌΠΌΡ ΠΏΠ°Ρ (None
), ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π°Π»ΠΈΠ΄Π½ΡΠ΅.
- ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΡΠΌΠΌΡ ΠΏΠ°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
max()
.
π ΠΡΠ΅Π½ΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ
- ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ nums
ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ O(1)
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ:
O(1)
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ°ΡΡΠΈΠ² d_sum_best
ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ 100
.
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn maximum_sum(nums: Vec<i32>) -> i32 {
const DIGIT_SUM_LIMIT: usize = 100; // Max digit sum for i32 is 82, 100 is a safe upper bound
let mut max_per_dsum = [None as Option<i32>; DIGIT_SUM_LIMIT]; // Stores the largest number for each digit sum
nums.into_iter().filter_map(|n| {
let d_sum = Self::digit_sum(n) as usize;
let (cur_sum, new_max) = match max_per_dsum[d_sum] {
Some(prev_max) => (Some(prev_max + n), prev_max.max(n)), // Compute sum and update max number
None => (None, n) // First occurrence of this digit sum
};
max_per_dsum[d_sum] = Some(new_max);
cur_sum // Only return valid sums
}).max().unwrap_or(-1) // Convert `None` to `-1` if no valid pair is found
}
// Helper function to compute the sum of digits of a number
fn digit_sum(mut n: i32) -> i32 {
let mut sum = 0;
while n > 0 {
sum += n % 10;
n /= 10;
}
sum
}
}
Tags: #rust #algorithms