跳至主要內容

2461. 长度为 K 子数组中的最大和


2461. 长度为 K 子数组中的最大和

🟠   🔖  数组 哈希表 滑动窗口  🔗 力扣open in new window LeetCodeopen in new window

题目

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

解题思路

可以使用滑动窗口和哈希集合来高效解决这个问题:

  1. 维护一个滑动窗口:窗口长度为 k,并且保证窗口中的元素都不重复。
  2. 使用哈希集合记录窗口内的元素:确保元素的唯一性,同时快速检查是否存在重复。
  3. 动态更新窗口和
    • 如果窗口中存在重复元素,移动左边界直到没有重复元素。
    • 当窗口大小为 k 时,更新当前的最大和。
  4. 边界处理:如果滑动窗口无法满足长度为 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+🟠🀄️open in new window 🔗open in new window
2401最长优雅子数组位运算 数组 滑动窗口🟠🀄️open in new window 🔗open in new window
2405子字符串的最优划分贪心 哈希表 字符串🟠🀄️open in new window 🔗open in new window
2537统计好子数组的数目数组 哈希表 滑动窗口🟠🀄️open in new window 🔗open in new window
3026最大好子数组和数组 哈希表 前缀和🟠🀄️open in new window 🔗open in new window
3254长度为 K 的子数组的能量值 I数组 滑动窗口🟠🀄️open in new window 🔗open in new window
3255长度为 K 的子数组的能量值 II数组 滑动窗口🟠🀄️open in new window 🔗open in new window