滑动定窗口(十四)2831. 找出最长等值子数组

2831. 找出最长等值子数组

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。

从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。

子数组 是数组中一个连续且可能为空的元素序列。

示例 1:

复制代码
输入:nums = [1,3,2,3,1,3], k = 3
输出:3
解释:最优的方案是删除下标 2 和下标 4 的元素。
删除后,nums 等于 [1, 3, 3, 3] 。
最长等值子数组从 i = 1 开始到 j = 3 结束,长度等于 3 。
可以证明无法创建更长的等值子数组。

示例 2:

复制代码
输入:nums = [1,1,2,2,1,1], k = 2
输出:4
解释:最优的方案是删除下标 2 和下标 3 的元素。 
删除后,nums 等于 [1, 1, 1, 1] 。 
数组自身就是等值子数组,长度等于 4 。 
可以证明无法创建更长的等值子数组。
cpp 复制代码
class Solution {
public:
    int longestEqualSubarray(vector<int>& nums, int k) {
        int left = 0, right = 0, n = nums.size();
        int res = 0; // 某个出现最大的次数
        unordered_map<int, int> mp;
        while(right < n)
        {
            mp[nums[right]]++; // 进窗口
            res = max(res, mp[nums[right]]); // 维护这个res记录出现次数最多的值
            if(right-left+1 - res > k) // 只有当需要删除的元素大于这个k时需要出窗口
                mp[nums[left++]]--; // 出窗口
            right++;
        }
        return res;
    }
};
相关推荐
风影同志7832429 分钟前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG1 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者1 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者2 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66682 小时前
PID——算法改进
算法
一只不想敲代码的程序猿4 小时前
如何更高效地拆解问题?
算法
微尘hjx5 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技5 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er6 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
Pniubi6 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展