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

УсловиС Π·Π°Π΄Π°Ρ‡ΠΈ β€” 2874. Maximum Value of an Ordered Triplet II.

πŸ“„ ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π½ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл nums (индСксация с нуля).
НуТно Π½Π°ΠΉΡ‚ΠΈ максимум выраТСния (nums[i]-nums[j])Β·nums[k] срСди всСх Ρ‚Ρ€ΠΎΠ΅ΠΊ индСксов i < j < k.
Если всС Ρ‚Π°ΠΊΠΈΠ΅ значСния ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 0.

πŸ’‘ ИдСя

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (nums[i]-nums[j])Β·nums[k] Π±ΡƒΠ΄Π΅Ρ‚ наибольшим, ΠΏΡ€ΠΈ фиксированном k, Ссли:

Π—Π½Π°Ρ‡ΠΈΡ‚, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ разности (nums[i]-nums[j]) Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ индСкса ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° nums[k], обновляя Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

πŸ” Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. ИдСм ΠΏΠΎ массиву слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС:
    • max_val Ρ…Ρ€Π°Π½ΠΈΡ‚ максимум ΠΈΠ· всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… чисСл (nums[..i]);
    • max_diff β€” максимум nums[i]-nums[j] Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚;
    • ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ max_diff Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ nums[k] ΠΈ обновляСм best.
  2. Всё дСлаСтся Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… структур Π΄Π°Π½Π½Ρ‹Ρ….

⏱️ Асимптотика

🧾 Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn maximum_triplet_value(nums: Vec<i32>) -> i64 {
        nums.into_iter().fold((0i64, 0, 0), |(best, max_diff, max_val), x| (
            best.max(x as i64 * max_diff as i64),
            max_diff.max(max_val - x),
            max_val.max(x),
        )).0
    }
}

Tags: #rust #algorithms #greedy