Skip to content

Latest commit

 

History

History
178 lines (141 loc) · 7.22 KB

2461.md

File metadata and controls

178 lines (141 loc) · 7.22 KB
title description keywords
2461. 长度为 K 子数组中的最大和
LeetCode 2461. 长度为 K 子数组中的最大和题解,Maximum Sum of Distinct Subarrays With Length K,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
2461. 长度为 K 子数组中的最大和
长度为 K 子数组中的最大和
Maximum Sum of Distinct Subarrays With Length K
解题思路
数组
哈希表
滑动窗口

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

🟠 Medium  🔖  数组 哈希表 滑动窗口  🔗 力扣 LeetCode

题目

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+ 🟠 🀄️ 🔗
2401 最长优雅子数组 位运算 数组 滑动窗口 🟠 🀄️ 🔗
2405 子字符串的最优划分 [✓] 贪心 哈希表 字符串 🟠 🀄️ 🔗
2537 统计好子数组的数目 数组 哈希表 滑动窗口 🟠 🀄️ 🔗
3026 最大好子数组和 数组 哈希表 前缀和 🟠 🀄️ 🔗
3254 长度为 K 的子数组的能量值 I 数组 滑动窗口 🟠 🀄️ 🔗
3255 长度为 K 的子数组的能量值 II 数组 滑动窗口 🟠 🀄️ 🔗