LeetCode 分类刷题:2958. 最多 K 个重复元素的最长子数组

发布于:2025-08-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

题目

给你一个整数数组 nums 和一个整数 k 。

一个元素 x 在数组中的 频率 指的是它在数组中的出现次数。

如果一个数组中所有元素的频率都 小于等于 k ,那么我们称这个数组是  数组。

请你返回 nums 中 最长好 子数组的长度。

子数组 指的是一个数组中一段连续非空的元素序列。

示例 1:

输入:nums = [1,2,3,1,2,3,1,2], k = 2
输出:6
解释:最长好子数组是 [1,2,3,1,2,3] ,值 1 ,2 和 3 在子数组中的频率都没有超过 k = 2 。[2,3,1,2,3,1] 和 [3,1,2,3,1,2] 也是好子数组。
最长好子数组的长度为 6 。

示例 2:

输入:nums = [1,2,1,2,1,2,1,2], k = 1
输出:2
解释:最长好子数组是 [1,2] ,值 1 和 2 在子数组中的频率都没有超过 k = 1 。[2,1] 也是好子数组。
最长好子数组的长度为 2 。

示例 3:

输入:nums = [5,5,5,5,5,5,5], k = 4
输出:4
解释:最长好子数组是 [5,5,5,5] ,值 5 在子数组中的频率没有超过 k = 4 。
最长好子数组的长度为 4 。

解析

思路大致和 LeetCode Hot 100:3. 无重复字符的最长子串-CSDN博客 一致。

对于本题,新加入元素 x=nums[right] 后,如果 x 的出现次数超过 k,则不断右移左指针 left,直到窗口内的 x 的出现次数等于 k 为止,然后用窗口大小 right−left+1 更新答案的最大值。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/length-of-longest-subarray-with-at-most-k-frequency/solutions/2560708/hua-dong-chuang-kou-fu-ti-dan-pythonjava-6fxo/
来源:力扣(LeetCode)

答案

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var maxSubarrayLength = function(nums, k) {
    let left = 0;
    let ans = 0;
    const cnt = new Map();
    for(let right = 0; right < nums.length; right++) {    //移动右指针,扩大窗口
        cnt.set(nums[right], (cnt.get(nums[right]) ?? 0) + 1);    //更新元素出现次数
        while(cnt.get(nums[right]) > k) {    //当元素出现次数超过k
            cnt.set(nums[left], cnt.get(nums[left]) - 1);
            left++;    //移动左指针,缩小窗口
        }
        ans = Math.max(ans, right - left + 1);    //更新子数组的长度
    }
    return ans;
};

复杂度分析

时间复杂度:O(n),其中 n 为 nums 的长度。注意 left 至多增加 n 次,所以整个二重循环至多循环 O(n) 次。

空间复杂度:O(n),map至多存储整个nums字符串。


网站公告

今日签到

点亮在社区的每一天
去签到