2461. 长度为 K 子数组中的最大和
2461. 长度为 K 子数组中的最大和
题目
You are given an integer array nums
and an integer k
. Find the maximum subarray sum of all the subarrays of nums
that meet the following conditions:
- The length of the subarray is
k
, and - All the elements of the subarray are distinct.
Return the maximum subarray sum of all the subarrays that meet the conditions . If no subarray meets the conditions, return 0
.
Asubarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,5,4,2,9,9,9], k = 3
Output: 15
Explanation: The subarrays of nums with length 3 are:
- [1,5,4] which meets the requirements and has a sum of 10.
- [5,4,2] which meets the requirements and has a sum of 11.
- [4,2,9] which meets the requirements and has a sum of 15.
- [2,9,9] which does not meet the requirements because the element 9 is repeated.
- [9,9,9] which does not meet the requirements because the element 9 is repeated.
We return 15 because it is the maximum subarray sum of all the subarrays that meet the conditions
Example 2:
Input: nums = [4,4,4], k = 3
Output: 0
Explanation: The subarrays of nums with length 3 are:
- [4,4,4] which does not meet the requirements because the element 4 is repeated.
We return 0 because no subarrays meet the conditions.
Constraints:
1 <= k <= nums.length <= 10^5
1 <= nums[i] <= 10^5
题目大意
给你一个整数数组 nums
和一个整数 k
。请你从 nums
中满足下述条件的全部子数组中找出最大子数组和:
- 子数组的长度是
k
,且 - 子数组中的所有元素 各不相同 。
返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0
。
子数组 是数组中一段连续非空的元素序列。
示例 1:
输入: nums = [1,5,4,2,9,9,9], k = 3
输出: 15
解释: nums 中长度为 3 的子数组是:
- [1,5,4] 满足全部条件,和为 10 。
- [5,4,2] 满足全部条件,和为 11 。
- [4,2,9] 满足全部条件,和为 15 。
- [2,9,9] 不满足全部条件,因为元素 9 出现重复。
- [9,9,9] 不满足全部条件,因为元素 9 出现重复。
因为 15 是满足全部条件的所有子数组中的最大子数组和,所以返回 15 。
示例 2:
输入: nums = [4,4,4], k = 3
输出: 0
解释: nums 中长度为 3 的子数组是:
- [4,4,4] 不满足全部条件,因为元素 4 出现重复。
因为不存在满足全部条件的子数组,所以返回 0 。
提示:
1 <= k <= nums.length <= 10^5
1 <= nums[i] <= 10^5
解题思路
可以使用滑动窗口和哈希集合来高效解决这个问题:
- 维护一个滑动窗口:窗口长度为
k
,并且保证窗口中的元素都不重复。 - 使用哈希集合记录窗口内的元素:确保元素的唯一性,同时快速检查是否存在重复。
- 动态更新窗口和:
- 如果窗口中存在重复元素,移动左边界直到没有重复元素。
- 当窗口大小为
k
时,更新当前的最大和。
- 边界处理:如果滑动窗口无法满足长度为
k
,最终返回0
。
复杂度分析
- 时间复杂度:
O(n)
,每次移动左边界最多遍历一次整个数组。 - 空间复杂度:
O(k)
,使用了一个哈希集合存储窗口中的元素,最多存储k
个元素。
代码
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var maximumSubarraySum = function (nums, k) {
let maxSum = 0;
let currentSum = 0;
let left = 0;
const seen = new Set();
for (let right = 0; right < nums.length; right++) {
// 如果出现重复元素,移动左边界直到窗口内无重复
while (seen.has(nums[right])) {
seen.delete(nums[left]);
currentSum -= nums[left];
left++;
}
// 将当前元素加入窗口
seen.add(nums[right]);
currentSum += nums[right];
// 检查窗口大小是否满足 k
if (right - left + 1 === k) {
maxSum = Math.max(maxSum, currentSum);
// 缩小窗口大小,准备检查下一个窗口
seen.delete(nums[left]);
currentSum -= nums[left];
left++;
}
}
return maxSum;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
1004 | 最大连续1的个数 III | [✓] | 数组 二分查找 前缀和 1+ | 🟠 | 🀄️ 🔗 |
2401 | 最长优雅子数组 | 位运算 数组 滑动窗口 | 🟠 | 🀄️ 🔗 | |
2405 | 子字符串的最优划分 | 贪心 哈希表 字符串 | 🟠 | 🀄️ 🔗 | |
2537 | 统计好子数组的数目 | 数组 哈希表 滑动窗口 | 🟠 | 🀄️ 🔗 | |
3026 | 最大好子数组和 | 数组 哈希表 前缀和 | 🟠 | 🀄️ 🔗 | |
3254 | 长度为 K 的子数组的能量值 I | 数组 滑动窗口 | 🟠 | 🀄️ 🔗 | |
3255 | 长度为 K 的子数组的能量值 II | 数组 滑动窗口 | 🟠 | 🀄️ 🔗 |