Welcome to Subscribe On Youtube
3381. Maximum Subarray Sum With Length Divisible by K
Description
You are given an array of integers nums
and an integer k
.
Return the maximum sum of a subarray of nums
, such that the size of the subarray is divisible by k
.
Example 1:
Input: nums = [1,2], k = 1
Output: 3
Explanation:
The subarray [1, 2]
with sum 3 has length equal to 2 which is divisible by 1.
Example 2:
Input: nums = [-1,-2,-3,-4,-5], k = 4
Output: -10
Explanation:
The maximum sum subarray is [-1, -2, -3, -4]
which has length equal to 4 which is divisible by 4.
Example 3:
Input: nums = [-5,1,2,-3,4], k = 2
Output: 4
Explanation:
The maximum sum subarray is [1, 2, -3, 4]
which has length equal to 4 which is divisible by 2.
Constraints:
1 <= k <= nums.length <= 2 * 105
-109 <= nums[i] <= 109
Solutions
Solution 1
-
class Solution { public long maxSubarraySum(int[] nums, int k) { long[] f = new long[k]; final long inf = 1L << 62; Arrays.fill(f, inf); f[k - 1] = 0; long s = 0; long ans = -inf; for (int i = 0; i < nums.length; ++i) { s += nums[i]; ans = Math.max(ans, s - f[i % k]); f[i % k] = Math.min(f[i % k], s); } return ans; } }
-
class Solution { public: long long maxSubarraySum(vector<int>& nums, int k) { using ll = long long; ll inf = 1e18; vector<ll> f(k, inf); ll ans = -inf; ll s = 0; f[k - 1] = 0; for (int i = 0; i < nums.size(); ++i) { s += nums[i]; ans = max(ans, s - f[i % k]); f[i % k] = min(f[i % k], s); } return ans; } };
-
class Solution: def maxSubarraySum(self, nums: List[int], k: int) -> int: f = [inf] * k ans = -inf s = f[-1] = 0 for i, x in enumerate(nums): s += x ans = max(ans, s - f[i % k]) f[i % k] = min(f[i % k], s) return ans
-
func maxSubarraySum(nums []int, k int) int64 { inf := int64(1) << 62 f := make([]int64, k) for i := range f { f[i] = inf } f[k-1] = 0 var s, ans int64 ans = -inf for i := 0; i < len(nums); i++ { s += int64(nums[i]) ans = max(ans, s-f[i%k]) f[i%k] = min(f[i%k], s) } return ans }
-
function maxSubarraySum(nums: number[], k: number): number { const f: number[] = Array(k).fill(Infinity); f[k - 1] = 0; let ans = -Infinity; let s = 0; for (let i = 0; i < nums.length; ++i) { s += nums[i]; ans = Math.max(ans, s - f[i % k]); f[i % k] = Math.min(f[i % k], s); } return ans; }