ΠΡΠ΅ΡΠ΅Π΄Π½Π°Ρ Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° - 3381. Maximum Subarray Sum With Length Divisible by K
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ΠΎ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ k
ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΡΠ΅Π» nums
. ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠ½Π° k
.
π ΠΠ΄Π΅Ρ
ΠΠ°Π½Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π° (Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΠ°Π΄Π°Π½Π΅) Π΄Π»Ρ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΊΡΠ°ΡΠ½ΠΎΠΉ k
. Π§ΡΠΎΠ±Ρ ΡΡΠ΅ΡΡΡ ΡΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΠΌΡ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°Π΅ΠΌ Π²ΡΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΠΏΠΎΠ»ΡΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅ [0,k)
ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Ρ Ρ ΡΠ°Π³ΠΎΠΌ k
.
π ΠΠΎΠ΄Ρ
ΠΎΠ΄
- ΠΡΠ΅ΡΠΈΠΊΡΠ½ΡΠ΅ ΡΡΠΌΠΌΡ:
- ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΡΡ
ΡΡΠΌΠΌ, ΡΡΠΎΠ±Ρ Π±ΡΡΡΡΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡ ΡΡΠΌΠΌΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°.
- ΠΠ΅ΡΠ΅Π±ΠΎΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ:
- ΠΡΠ΅ΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΌ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡΠΌ
[0,k)
, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Ρ Π΄Π»ΠΈΠ½ΠΎΠΉ, ΠΊΡΠ°ΡΠ½ΠΎΠΉ k
.
- ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΠ°Π΄Π°Π½Π΅:
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°.
- ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠ°Ρ ΡΡΠΌΠΌΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ, Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΡΡΠ΅Ρ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ (ΡΠ±ΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°).
β±οΈ ΠΡΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
-
ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
- ΠΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΡΡ
ΡΡΠΌΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
O(n)
.
- ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΈΠΊΠ»: Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠΈΠΊΠ» Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ
O(k)
, Π° Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ β O(n/k)
, ΡΡΠΎ Π² ΡΡΠΌΠΌΠ΅ Π΄Π°Π΅Ρ O(k)ΓO(n/k)=O(n)
.
- ΠΡΠΎΠ³ΠΎΠ²Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
.
-
ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
O(n)
Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΡΡ
ΡΡΠΌΠΌ.
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ΅Π½ΠΈΡ
impl Solution {
pub fn max_subarray_sum(nums: Vec<i32>, k: i32) -> i64 {
let n = nums.len();
let k = k as usize;
// Compute prefix sums
let mut prefix_sums = vec![0i64; n + 1];
for i in 0..n {
prefix_sums[i + 1] = prefix_sums[i] + nums[i] as i64;
}
let mut best = i64::MIN;
// Iterate over each offset
for offset in 0..k {
let mut start = offset;
for end in (offset + k..=n).step_by(k) {
// Calculate the subarray sum
let subarray_sum = prefix_sums[end] - prefix_sums[start];
// Update the best result
best = best.max(subarray_sum);
// Reset start if the current sum is negative
if subarray_sum < 0 {
start = end;
}
}
}
best
}
}