【精品】【算法实战】每日一题:如何用Python实现给定整数序列中寻找最小长度窗口以包含所有不同元素的算法?

问题:

如何用Python实现给定整数序列中寻找最小长度窗口以包含所有不同元素的算法?

核心思路

核心思路是利用双端队列(作为滑动窗口)来找到一个满足特定条件的最小长度子序列。算法遍历给定的序列,对于每个新数据点,执行以下三种操作之一:

  1. 如果数据点不在当前窗口中,则将其添加到队列中(表示窗口扩展)。
  2. 如果数据点已存在于窗口中,但队首和队尾的元素不同(意味着窗口中尚需包含此元素),则仍然将其加入队列。(损耗元素,知道有但是还是得加入)
  3. 如果数据点已存在,且队首和队尾的元素相同(表示该元素类型已满足),则从队列中移除队首元素(缩短窗口)。

在遍历过程中,维护一个记录最小长度窗口的变量。如果当前窗口包含所有必需的不同元素类型,并且比之前记录的任何窗口都小,则更新最小长度窗口的记录。最终,得到一个满足条件的最小长度窗口。

进一步给出伪码思路

初始化一个双端队列 q 和一些计数器以及变量。定义主函数 main:读取输入的 n 和 m,分别代表数组长度和目标不同元素的数量。读取数组 a 并将其转换为整数列表。对数组 a 中的每个元素执行以下操作:如果当前元素的计数器 cnt 为 0,增加类型数量 type。增加当前元素的计数器。将当前索引添加到双端队列 q 的末尾。如果双端队列 q 不为空且队首元素的计数器大于 1,移除队首元素,直到计数器为 1。如果当前类型数量等于目标 m 且双端队列的长度小于当前记录的最小长度 ans,则更新 ans 以及起始索引 l 和结束索引 r。打印出最小长度窗口的起始索引和结束索引,索引加 1(因为 Python 索引从 0 开始)。定义函数 qsize 来返回双端队列 q 的大小。如果这是主程序,调用 main 函数。

CODE


from collections import deque# 初始化变量
ans = float('inf')
n, m = 0, 0
a = []
cnt = [0] * 10000
l, r, type = 0, 0, 0
q = deque()def main():global ans, l, r, typen, m = map(int, input().split())a = list(map(int, input().split()))# 统计每个数出现的次数,并判断是否需要type++for i in range(n):if cnt[a[i]] == 0:type += 1cnt[a[i]] += 1q.append(i)# 移除队首元素,直到cnt[a[q[0]]]为0while q and cnt[a[q[0]]] > 1:cnt[a[q.popleft()]] -= 1# 如果type=m,且队列长度<ans,则更新ans和l,rif type == m and qsize() < ans:ans = qsize()l = q[0]r = q[-1]print(l + 1, r + 1)  # 输出时加1,因为Python索引从0开始def qsize():return len(q)if __name__ == '__main__':main()

注:

  1. ans = float('inf'):
    ans 变量用于存储找到的满足条件的最小长度子数组的长度。初始化为正无穷大(float('inf')),意味着我们从找一个非常大的长度开始,随着算法的进行,如果找到更小的满足条件的子数组,就会更新这个值。

  2. n, m = 0, 0:
    n 是数组 a 的长度,即数组中元素的总数。
    m 是我们需要在子数组中找到的不同元素的类型数。

  3. a = []:
    a 是一个空列表,稍后将用来存储输入的整数数组。

  4. cnt = [0] * 10000:
    cnt 是一个长度为 3000 的列表,用于计数。它将用于跟踪数组 a 中每个元素的出现次数,10000因为测试用例可能比较大

  5. l, r, type = 0, 0, 0:
    lr 是子数组的起始和结束索引,初始化为 0。随着算法的进行,它们将被更新为满足条件的最小长度子数组的起始和结束索引。
    type 是一个计数器,用于跟踪当前窗口中不同元素的类型数。

  6. q = deque():
    q 是一个 deque(双端队列)实例,它将被用作滑动窗口的数据结构。双端队列允许我们从两端快速添加和删除元素,非常适合实现滑动窗口。

END

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

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

相关文章

【Spring】Spring框架对RESTFul风格的支持

1、简介 Spring框架对RESTful风格的支持主要体现在Spring MVC和Spring Boot等模块中。RESTful&#xff08;Representational State Transfer&#xff0c;表述层资源状态转移&#xff09;是一种软件架构风格&#xff0c;它强调资源&#xff08;通常是网络上的信息&#xff09;的…

Java方法的基本用法

Java方法的基本用法 前言一、什么是方法方法存在的意义示例 二、方法定义语法基本语法代码示例注意事项 三、方法调用的执行过程基本规则代码示例计算两个整数相加计算 1! 2! 3! 4! 5! 四、实参和形参的关系代码示例交换两个整型变量原因分析解决办法 五、没有返回值的方法…

初识java——javaSE (6)接口的实现——比较器与深拷贝,浅拷贝

文章目录 前言一 比较器1.1 关于两个对象的比较1.2 Comparable接口&#xff1a;1.3 Arrays.sort方法的实现1.4 比较器的实现Comparator接口 二 深拷贝与浅拷贝2.1 浅拷贝&#xff1a;Cloneable接口&#xff1a;clone方法&#xff1a;实现拷贝&#xff1a;浅拷贝&#xff1a; 2.…

Python3 笔记:Python的所有关键字

查看Python的关键字首先需要用import导入keyword模块 import keyword # 查看Python的所有关键字&#xff0c;先用import导入keyword模块 print(keyword.kwlist) 运行结果&#xff1a; [False, None, True, and, as, assert, async, await, break, class, continue, def, …

MQ如何保证消息不丢失

MQ如何保证消息不丢失 问题分析具体分析及解决方案RabbitMQ生产者RabbitMQ配置消费者 KafkaKafka配置消费者 问题分析 从Kafka和RabbitMQ进行分析&#xff0c;MQ消息丢失的情况有生产者推送消息时数据丢失&#xff0c;MQ中间件宕机情况下数据丢失&#xff0c;消费者消费时消息…

GoLand map中的并发问题——为什么会造成并发问题?该怎么解决?

GoLand map中的并发问题——为什么会造成并发问题&#xff1f;该怎么解决&#xff1f; 问题提出原因解析具体原因竞态检测器 如何解决并发问题呢&#xff1f;方法一 &#xff1a; 使用sync.Mutex方法二&#xff1a; 使用sync.Map我们首先了解一下sync.Map的常用方法&#xff1a…

2024.5.24.python.exercise

# python文件操作 # f open("打字版.txt", "a", encoding"UTF-8") # writer input("请输入你想要写入到文件的内容") # f.write(writer) # f.flush() # f.close() # f open("打字版.txt", "r", encoding"…

代码随想录算法训练营第三十九天 | 738.单调递增的数字、968.监控二叉树 (可以跳过)

监控二叉树同样的等代码随想录刷完后&#xff0c;再回头来看&#xff0c;先跳过 738.单调递增的数字 代码随想录 解题思路 例如&#xff1a;98&#xff0c;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]--…

游戏引擎支持脚本编程的好处

哈喽呀&#xff0c;大家好&#xff0c;淼淼又来和大家见面啦&#xff0c;咱们今天来聊聊游戏引擎&#xff0c;游戏引擎作为现代游戏开发的核心&#xff0c;它集成了图形渲染、物理模拟、音频处理、动画系统、输入输出控制等多种复杂技术于一体&#xff0c;为开发者提供了一个高…

ASP+ACCESS基于WEB网上留言板

摘要 本文概述了ACCESS数据库及其相关的一些知识&#xff0c;着重论述ACCESS数据库和ASP的中间技术&#xff0c;构建一个简单的留言板。具体的实现是构造一个留言板系统&#xff0c;能很方便的和同学沟通和交流。留言板具有功能强大、使用方便的特点。用户以个人的身份进入&am…

瑞芯微RV1126——人脸识别源码分析

本节内容主要分为3部分&#xff0c;第一部分是流程结构图;第二部分为人脸识别代码流程;第三部分为具体的代码分析。 1.流程结构图 2.人脸识别代码流程 1、人脸数据的初始化&#xff1a; init_all_rockx_face_data();init_face_data();2、创建rtsp会话&#xff0c;这里包括发…

一个典型的分布式缓存系统是什么样的?no.32

分布式 Redis 服务 由于本课程聚焦于缓存&#xff0c;接下来&#xff0c;我将以微博内的 分布式 Redis 服务系统为例&#xff0c;介绍一个典型的分布式缓存系统的组成。 微博的 Redis 服务内部也称为 RedisService。RedisService 的整体架构如图所示。主要分为Proxy、存储、集…

产品推荐 | 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作为主处理器&#xff0c;主要用于FPGA硬件加速。板卡设计满足工业级要求。如下图所示&#xff1a; 二、功能和技术指标 板卡功能 参数内容 主处理器 XCKU115-3-FLVF1924-E 板卡…

UE4/UE5像素流送云推流:多人访问不稳定、画面糊、端口占用多等

UE4/UE5想要实现网页访问&#xff0c;很多工程师会选择guan方的像素流送。但这个技术要求在模型开发初期就接入。对于一些已有UE模型是无法进行流化的。虽然也可以解决新UE模型的网页访问问题&#xff0c;但在实际的应用中&#xff0c;点量云流也收到很多反馈说&#xff0c;使用…

netty-socketio 集群随记

实现netty-socketio集群的方式 代码实例 PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}"…

Python爬取B站视频:封装一下

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

大数据Hadoop之-工具HIVE(一)

大数据Hadoop之——数据仓库Hive HIVE介绍Hive是基于Hadoop的一个数据仓库(Data Aarehouse,简称数仓、DW),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。是用于存储、分析、报告的数据系统。 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理…

解释Spring Bean的生命周期

Spring Bean的生命周期涉及到Bean的创建、配置、使用和销毁的各个阶段。理解这个生命周期对于编写高效的Spring应用和充分利用框架的功能非常重要。下面是Spring Bean生命周期的主要步骤&#xff1a; 1. 实例化Bean Spring容器首先将使用Bean的定义&#xff08;无论是XML、注…

使用Golang调用腾讯云邮件模版发送邮件

文章目录 一、腾讯云邮件模版创建1.1 发信域名配置1.2 发信地址设置1.3 发信模版设置 二、通过Golang发送邮件2.1 代码示例2.2 代码说明 三、常见问题3.1 UnsupportedRegion3.2 InvalidTemplateID 本文档介绍了如何使用Golang编写代码&#xff0c;通过腾讯云邮件服务&#xff0…

【Linux】中的常见的重要指令(中)

目录 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: m…