Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ β 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[i]-nums[j]
ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°
ΠΠ½Π°ΡΠΈΡ, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π½ΠΎΡΡΠΈ (nums[i]-nums[j])
Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ ΡΠΌΠ½ΠΎΠΆΠ°ΡΡ Π΅Π³ΠΎ Π½Π° nums[k]
, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ Π»ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
π ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- ΠΠ΄Π΅ΠΌ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ. ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅:
max_val
Ρ
ΡΠ°Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΈΠ· Π²ΡΠ΅Ρ
ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
ΡΠΈΡΠ΅Π» (nums[..i]
);
max_diff
β ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ nums[i]-nums[j]
Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ;
- ΡΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ
max_diff
Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ nums[k]
ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ best
.
- ΠΡΡ Π΄Π΅Π»Π°Π΅ΡΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄, Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ
.
β±οΈ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΡ:
O(n)
β ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ
- ΠΠ°ΠΌΡΡΡ:
O(1)
β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ 3 ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
π§Ύ ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
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