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 。
可以证明无法创建更长的等值子数组。

解题思路

1.元素分类: 构建一个哈希表,用来记录数字中所有出现的元素以及对应的位置
2.设置窗口: 对每个元素,采用滑动窗口去寻找最长的子数组,窗口的左右边界为[i,j]
3.滑动窗口: 在滑动窗口时,要保证窗口内删除的元素不能超过k,超过则把ij移动
4.计算窗口长度: 每滑动一次窗口,就计算一次窗口长度:i-j+1,并和全局长度进行比较,保留较长的

class Solution {
public:int longestEqualSubarray(vector<int>& nums, int k) {int n=nums.size();//构建哈希表,记录每个元素的索引unordered_map<int,vector<int>> pos;for(int i=0;i<n;i++){pos[nums[i]].push_back(i);//记录每个元素的索引}int res=0;//初始化全局最大长度for(auto &[_,vec]:pos){int i=0;//窗口左端点for(int j=0;j<vec.size();j++){//窗口右端点,不停的向右滑动while(vec[j]-vec[i]-(j-i)>k){//每滑动一次就判断一次i++;}res=max(res,j-i+1);//更新全局最大长度}}return res;}
};

题后学习

假设我们的 unordered_map pos 如下所示:

unordered_map<int, vector<int>> pos = {{1, {0, 2, 4}},{2, {1, 3}},{3, {5}}
};

在这个哈希表中:

键 1 对应的值是一个向量 {0, 2, 4}。
键 2 对应的值是一个向量 {1, 3}。
键 3 对应的值是一个向量 {5}。

嵌套循环代码

for(auto &[_,vec]:pos){int i=0; // 窗口左端点for(int j=0;j<vec.size();j++)// ...
  1. 第一次迭代(外层循环处理键 1):
    vec 引用向量 {0, 2, 4}
    i 初始化为0
    内层循环将遍历 {0, 2, 4},j 从0开始,依次为0, 1, 2。

  2. 第二次迭代(外层循环处理键 2):
    vec 引用向量 {1, 3}
    i 再次初始化为0
    内层循环将遍历 {1, 3},j 从0开始,依次为0, 1。

  3. 第三次迭代(外层循环处理键 3):
    vec 引用向量 {5}
    i 再次初始化为0
    内层循环将遍历 {5},j 从0开始,但因为只有一个元素,所以只执行一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电路笔记 :元器件焊接相关 酒精灯松香浴加热取芯片

记录一下只使用松香和小火源加热&#xff08;如酒精灯、小蜡烛&#xff09;从电路板中取芯片。 过程 多放松香 让松香淹没芯片尽量均匀加热&#xff0c;等芯片旁边的松香开始从芯片里冒细小的“泡泡”&#xff0c;就差不多了 注&#xff1a;这种方法也可以用于焊接&#xff0…

Qt QString详细用法

一.基础用法 1.创建QString对象 QString str1 "Hello, World!"; QString str2("This is a QString object."); //一个是等号的重载&#xff0c;一个是拷贝构造&#xff0c;本质上是等价的 2.获取字符串长度 int length str1.length(); // 返回字符串…

大模型落地竞逐,云计算大厂“百舸争流”

作者 | 辰纹 来源 | 洞见新研社 从ChatGPT到Sora&#xff0c;从图文到视频&#xff0c;从通用大模型到垂直大模型……经过了1年多时间的探索&#xff0c;大模型进入到以落地为先的第二阶段。 行业的躁动与资本的狂热相交汇&#xff0c;既造就了信仰派的脚踏实地&#xff0c;也…

7.从0做一个vue键盘组件

文章目录 1. 从0做一个键盘组件1.1. 最终效果1.2. 分析1.3. 实现1.4. 如何引用 1. 从0做一个键盘组件 首先是why的问题&#xff1a;为什么需要做键盘组件&#xff1f; 我们目前可知的场景&#xff1a; 在新增账单的时候&#xff0c;需要用到键盘在比如从账单列表页&#xff…

保护共享资源的方法(互斥锁)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

MagicAnimate: Temporally Consistent Human Image Animation using Diffusion Model

show lab NUS&bytedancehttps://github.com/magic-research/magic-animate 问题引入 输入参考图片 I r e f I_{ref} Iref​和动作序列 p 1 : N [ p 1 , ⋯ , p N ] p^{1:N}[p_1,\cdots,p_N] p1:N[p1​,⋯,pN​]&#xff0c;其中 N N N表示的是帧数&#xff0c;输出的是 …

探索iOS中的KVC

目录 前言 1.iOS中的KVC&#xff08;键值编码&#xff09; 1. 什么是KVC&#xff1f; 2. 使用KVC 1.设置属性值 2.获取属性值 3. KVC的高级用法 1.访问私有属性 2.访问集合属性 4. KVC的安全性 5. KVC原理 1. 查找顺序 2. 设置值 6.参考文章 前言 这篇文章主要是…

UbuntuLinux系统下安装wrk和使用

前言 wrk是一个用c语言写的压力测试工具&#xff0c;非常有用&#xff0c;但是ubuntu的软件仓库没有收录wrk&#xff0c;需要我们自己进行编译和安装&#xff0c;最近在学习一些性能测试、性能优化方面的知识&#xff0c;需要使用到这个强有力的工具&#xff0c;故此记录安装和…

Windows安全应急--在应急响应中需要知道的信息

在网络安全事件发生后&#xff0c;一般是要去客户现场排查问题的&#xff0c; 那么要想解决问题&#xff0c;信息的完整性决定了这次任务的成败。。 1. 你需要知道的&#xff1a; 先让客户梳理一遍事情的起因经过结果 询问客户需要解决的问题 了解客户的网络环境&#xff08…

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值&#xff0c;并将其返回&#xff0c;可以按照以下方式实现system_read_reg函数&#xff1a; #…

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…

innerText和innerHTML的区别

innerHTML和innerText都是元素的属性&#xff0c;通过修改这个元素的属性可以达到修改元素内容的目的。但是二者之间略有不同。具体来说&#xff0c;它们的区别如下&#xff1a; innerHTML可以获取或设置元素内部的HTML内容&#xff0c;包括HTML标签&#xff0c;而innerText则…

LeetCode 79.单词搜索

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内…

若依前后端分离版本-前后端交互整理

ruoyi-ui与后端交互 方法一&#xff1a;表单 使用 headers: {Content-Type:application/x-www-form-urlencoded}, ruoyi-ui的vue中 //ruoyi-ui的vue中定义 formData: {a: 111,b: 111,c: 1,}, //vue中方法调用 outBound() { empty(this.formData).…

6款网页表白代码6(附带源码)

6款网页表白代码6 前言效果图及部分源码1.爱心倒计时2.一起看星星3.爱心4.爱心&#xff08;有鼠标移动特效&#xff09;5.爱心&#xff08;高级效果&#xff09;6.爱心&#xff08;3D效果&#xff09; 领取源码下期更新预报 前言 大部分人都有喜欢的人&#xff0c;学会这些表白…

蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

微软Edge

微软Edge浏览器概述 功能介绍 微软Edge是一款基于Chromium开源项目的网页浏览器&#xff0c;旨在提供更快的网页加载速度、更高的安全性和更好的用户体验。它支持多种操作系统&#xff0c;包括Windows、macOS、Android和iOS&#xff0c;能够满足不同用户的需求。Edge浏览器拥…

赶紧收藏!2024 年最常见 20道 Redis面试题(三)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;二&#xff09;-CSDN博客 五、Redis的持久化机制是什么&#xff1f; Redis 是一个高性能的键值存储系统&#xff0c;支持多种类型的数据结构&#xff0c;如字符串、哈希、列表、集合、…

python数据类型之字符串

目录 1.字符串概念和注意事项 2.字符串内置函数 3.字符串的索引、切片和遍历 4.字符串运算符 5.字符串常用方法 性质判断 开头结尾判断 是否存在某个子串 大小写等格式转化 子串替换 删除两端空白字符 格式化字符串 分割与合并 6.字符串模板 7.exec 函数 8.字符…

【Linux】-Zookeeper安装部署[17]

简介 apache ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和H…