3381. 长度可被 K 整除的子数组的最大元素和
November 20, 2025 · View on GitHub
题目描述
给你一个整数数组 nums 和一个整数 k 。
返回 nums 中一个 非空子数组 的 最大 和,要求该子数组的长度可以 被 k 整除。
示例 1:
输入: nums = [1,2], k = 1
输出: 3
解释:
子数组 [1, 2] 的和为 3,其长度为 2,可以被 1 整除。
示例 2:
输入: nums = [-1,-2,-3,-4,-5], k = 4
输出: -10
解释:
满足题意且和最大的子数组是 [-1, -2, -3, -4],其长度为 4,可以被 4 整除。
示例 3:
输入: nums = [-5,1,2,-3,4], k = 2
输出: 4
解释:
满足题意且和最大的子数组是 [1, 2, -3, 4],其长度为 4,可以被 2 整除。
提示:
1 <= k <= nums.length <= 2 * 105-109 <= nums[i] <= 109
解法
方法一:前缀和 + 枚举
根据题目描述,要使得子数组的长度可以被 整除,等价于要求子数组 中,满足 。
我们可以枚举子数组的右端点 ,并使用一个长度为 的数组 来记录每个模 的前缀和的最小值。初始时 ,表示下标 的前缀和为 $0$。
那么对于当前的右端点 ,前缀和为 ,我们可以计算出以 为右端点的、长度可以被 整除的子数组的最大和为 ,以此更新答案。同时,我们也需要更新 ,使其等于当前前缀和 和 的较小值。
枚举结束后,返回答案即可。
时间复杂度 ,空间复杂度 。其中 为数组 的长度。
Python3
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
Java
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;
}
}
C++
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;
}
};
Go
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
}
TypeScript
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;
}
Rust
impl Solution {
pub fn max_subarray_sum(nums: Vec<i32>, k: i32) -> i64 {
let k = k as usize;
let inf = 1i64 << 62;
let mut f = vec![inf; k];
f[k - 1] = 0;
let mut s = 0i64;
let mut ans = -inf;
for (i, &x) in nums.iter().enumerate() {
s += x as i64;
ans = ans.max(s - f[i % k]);
f[i % k] = f[i % k].min(s);
}
ans
}
}