Input: nums =[-1,-2,-3,-4,-5], k =4Output: -10Explanation:
The maximum sum subarray is`[-1, -2, -3, -4]` which has length equal to 4which is divisible by 4.
We want the maximum subarray sum whose length is divisible by k. For each prefix sum, we can use a hash map to store the minimum prefix sum for each modulo class of the index. This allows us to efficiently check all subarrays of length divisible by k.
classSolution {
public:int maximumSubarraySum(vector<int>& nums, int k) {
int n = nums.size();
vector<longlong> prefix(n+1);
for (int i =0; i < n; ++i) prefix[i+1] = prefix[i] + nums[i];
vector<longlong> min_prefix(k, LLONG_MAX);
min_prefix[0] =0;
longlong ans = LLONG_MIN;
for (int i =1; i <= n; ++i) {
int mod = i % k;
if (min_prefix[mod] != LLONG_MAX)
ans = max(ans, prefix[i] - min_prefix[mod]);
min_prefix[mod] = min(min_prefix[mod], prefix[i]);
}
return ans;
}
};
classSolution {
publicintmaximumSubarraySum(int[] nums, int k) {
int n = nums.length;
long[] prefix =newlong[n+1];
for (int i = 0; i < n; ++i) prefix[i+1]= prefix[i]+ nums[i];
long[] minPrefix =newlong[k];
Arrays.fill(minPrefix, Long.MAX_VALUE);
minPrefix[0]= 0;
long ans = Long.MIN_VALUE;
for (int i = 1; i <= n; ++i) {
int mod = i % k;
if (minPrefix[mod]!= Long.MAX_VALUE)
ans = Math.max(ans, prefix[i]- minPrefix[mod]);
minPrefix[mod]= Math.min(minPrefix[mod], prefix[i]);
}
return (int)ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
funmaximumSubarraySum(nums: IntArray, k: Int): Int {
val n = nums.size
val prefix = LongArray(n+1)
for (i in0 until n) prefix[i+1] = prefix[i] + nums[i]
val minPrefix = LongArray(k) { Long.MAX_VALUE }
minPrefix[0] = 0Lvar ans = Long.MIN_VALUE
for (i in1..n) {
val mod = i % k
if (minPrefix[mod] !=Long.MAX_VALUE)
ans = maxOf(ans, prefix[i] - minPrefix[mod])
minPrefix[mod] = minOf(minPrefix[mod], prefix[i])
}
return ans.toInt()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defmaximumSubarraySum(self, nums: list[int], k: int) -> int:
n = len(nums)
prefix = [0] * (n+1)
for i in range(n):
prefix[i+1] = prefix[i] + nums[i]
min_prefix = [float('inf')] * k
min_prefix[0] =0 ans = float('-inf')
for i in range(1, n+1):
mod = i % k
if min_prefix[mod] != float('inf'):
ans = max(ans, prefix[i] - min_prefix[mod])
min_prefix[mod] = min(min_prefix[mod], prefix[i])
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
impl Solution {
pubfnmaximum_subarray_sum(nums: Vec<i32>, k: i32) -> i32 {
let n = nums.len();
letmut prefix =vec![0i64; n+1];
for i in0..n { prefix[i+1] = prefix[i] + nums[i] asi64; }
letmut min_prefix =vec![i64::MAX; k asusize];
min_prefix[0] =0;
letmut ans =i64::MIN;
for i in1..=n {
let m = i % k asusize;
if min_prefix[m] !=i64::MAX {
ans = ans.max(prefix[i] - min_prefix[m]);
}
min_prefix[m] = min_prefix[m].min(prefix[i]);
}
ans asi32 }
}