главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ – 2342. Max Sum of a Pair With Equal Sum of Digits

πŸ“Œ УсловиС Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π½ массив ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл nums. НСобходимо Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… элСмСнтов, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… одинаковая сумма Ρ†ΠΈΡ„Ρ€. Если Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€ Π½Π΅Ρ‚ β€” Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ -1.

πŸ’‘ ИдСя Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

ВмСсто хранСния всСх чисСл с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ суммой Ρ†ΠΈΡ„Ρ€, достаточно Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ максимальноС ΠΈΠ· Π½ΠΈΡ….
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ встрСчС Π½ΠΎΠ²ΠΎΠ³ΠΎ числа с Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ суммой Ρ†ΠΈΡ„Ρ€ ΠΌΠΎΠΆΠ½ΠΎ сразу ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π»ΠΈ ΠΎΠ½ΠΎ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΠ°Ρ€Ρƒ.

πŸ” ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ массив max_per_dsum, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ…Ρ€Π°Π½ΠΈΠΌ наибольшСС число для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ суммы Ρ†ΠΈΡ„Ρ€.
    • Максимальная сумма Ρ†ΠΈΡ„Ρ€ для i32 β€” 82, Π½ΠΎ ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ массив сотнСй для простоты.
  2. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ nums Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, примСняя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ с filter_map:
    • вычисляСм сумму Ρ†ΠΈΡ„Ρ€ d_sum для числа n;
    • Ссли ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ число с Ρ‚Π°ΠΊΠΈΠΌ d_sum, опрСдСляСм Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму ΠΏΠ°Ρ€Ρ‹ ΠΈ сохраняСм ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΠΎΠ΅ максимальноС число;
    • Ссли это ΠΏΠ΅Ρ€Π²ΠΎΠ΅ число с Π΄Π°Π½Π½Ρ‹ΠΌ d_sum, просто сохраняСм Π΅Π³ΠΎ Π² max_per_dsum;
    • filter_map отбрасываСт Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ суммы ΠΏΠ°Ρ€ (None), оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅.
  3. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ сумму ΠΏΠ°Ρ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ max().

πŸ“Š ΠžΡ†Π΅Π½ΠΊΠ° слоТности

πŸ’» Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

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