Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΡΠ΅ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ 2054. Two Best Non-Overlapping Events. ΠΡΠ΄Π΅ΠΌ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ;)
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ Π΄Π»Ρ Π½ΠΈΡ
start_time
, end_time
ΠΈ value
. ΠΡΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π΄Π²Π° Π½Π΅ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ
ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΉ ΡΠ΅Π½Π½ΠΎΡΡΡΡ. Π‘ΠΎΠ±ΡΡΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ΄Π½ΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π΄ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ.
π‘ ΠΠ΄Π΅Ρ
Π‘ΠΎΡΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΠΎ end_time
(Π² ΡΠ±ΡΠ²Π°ΡΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅). ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π²ΡΠ΅ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠΈΠ΅ΡΡ Π΄ΠΎ Π΅Π³ΠΎ Π½Π°ΡΠ°Π»Π°. ΠΡΡΠ°ΡΡΡΡ Π½Π°ΠΉΡΠΈ ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ
ΡΠΎΠ±ΡΡΠΈΠ΅ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΡΡ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅ΠΌ Ρ
ΡΠ°Π½ΠΈΡΡ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅Π½Π½ΠΎΡΡΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ max_vals
.
π οΈ ΠΠΎΠ΄Ρ
ΠΎΠ΄
-
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ: ΠΠΎ
end_time
Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ±ΡΠ²Π°Π½ΠΈΡ.
-
ΠΡΠ΅Π΄ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ
ΡΠ΅Π½Π½ΠΎΡΡΠ΅ΠΉ: Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΌΠ°ΡΡΠΈΠ²
max_vals
Ρ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ (ΡΠΏΡΠ°Π²Π°-Π½Π°Π»Π΅Π²ΠΎ).
-
ΠΡΠ΅ΡΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠΈΡΠΊ:
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ΅, Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΠ΅Π΅ΡΡ ΡΠ°Π½ΡΡΠ΅ Π΅Π³ΠΎ, ΡΠ΅ΡΠ΅Π· Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ.
- Π‘ΡΠΌΠΌΠΈΡΡΠ΅ΠΌ ΡΠ΅Π½Π½ΠΎΡΡΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π½Π½ΠΎΡΡΠΈ ΠΏΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ ΠΎΠ±ΡΠΈΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ.
β±οΈ ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΡ:
O(N logN)
(ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΈ Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ).
- ΠΠ°ΠΌΡΡΡ:
O(N)
Π΄Π»Ρ max_vals
.
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΡ
impl Solution {
pub fn max_two_events(events: Vec<Vec<i32>>) -> i32 {
let mut events = events;
// Sort events by end time in descending order
events.sort_by(|a, b| b[1].cmp(&a[1]));
let n = events.len();
let mut max_vals = vec![0; n + 1]; // To store max values from right to left
// Populate max_vals array with maximum values from right to left
for i in (0..n).rev() {
max_vals[i] = max_vals[i + 1].max(events[i][2]);
}
let mut best = 0;
// Iterate over each event to find the best combination
for i in 0..n {
let current_value = events[i][2];
// Binary search for the first event that ends before the current event starts
let end_time = events[i][0] - 1;
let idx = events.binary_search_by(|event| end_time.cmp(&event[1]))
.unwrap_or_else(|x| x);
let total_value = if idx < n { current_value + max_vals[idx] } else { current_value };
// Update the best value
best = best.max(total_value);
}
best
}
}