当前位置: 首页 > article >正文

备战蓝桥杯:双指针(滑动窗口)算法之逛花展

P1638 逛画展 - 洛谷 | 计算机科学教育新生态

这道题我们只要用一个kind和一个mp[N]的数组就能解决了

我们的解法1就是暴力枚举,先固定2,从2开始找连续的满足所有种类的最短的子数组,然后固定5,3,1,3,2,分别找出满足所有种类的最短子数组

mp[i]如果是从0到1,kind++,如果是从1到0,kind--

如图,暴力枚举的话j指向的一定是第一次出现的最新的元素种类,如果我们是暴力枚举的话,我们枚举5的时候,j也会回到5

我们对5枚举的时候,j一定会再走到4那个位置,我们何必让j回退呢?

那我们的算法流程就是用left和right指针指向第一个元素,然后让right指针向后走把每个元素进窗口,如果kind种类够了的话,left不断++,再不断更新每个合法的子数组的大小,直到kind不够了再退出去继续right向后走

比如这是一种结果,2出窗口后又是一个结果 

5出窗口后种类不够了,j向后走

不满足要求就不更新结果直到再次符合要求,我们再次让left出窗口

到这里把3出窗口之后再次成为不合法数组

再次合法,继续出left,出了一个就不合法了,right向后走一格,结束

我们来展示一下代码

#include <iostream>
using namespace std;

const int N = 1e6+10;
int n,m;
int mp[N];
int a[N];
int main()
{
	cin >> n  >> m;
	for(int i = 1;i<=n;i++) cin >> a[i];
	
	int kind = 0;
	int left = 1 , right = 1;
	int ret = n,begin = 1;
	while(right<=n)
	{
	    if(mp[a[right]]++ == 0) kind++;
		while(kind == m)
		{
		    int len = right-left+1;
		    if(len < ret)
		    {
		    	ret = len;
		    	begin = left;
			}
		    if(mp[a[left]]-- == 1) kind--;
		    left++;
		}	
		right++;
	}
	cout << begin <<" " << begin+ret-1<< endl;
       	
	
	
	
	
	
	
	
	return 0;
}


http://www.kler.cn/a/542944.html

相关文章:

  • Python实现GO鹅优化算法优化支持向量机SVM分类模型项目实战
  • 算法跟练第十弹——栈与队列
  • 不小心删除服务[null]后,git bash出现错误
  • IPoIB模块初始化过程详解
  • 防御综合实验
  • ffmpeg -formats
  • SpringBoot分布式开发依赖项中,除了myql、redis,都要哪些依赖项是需要本地安装软件并开启服务的?
  • 蓝桥杯---N字形变换(leetcode第6题)题解
  • IDEA中列举的是否是SpringBoot的依赖项的全部?在哪里能查到所有依赖项,如何开发自己的依赖项让别人使用
  • Django:构建高效Web应用的强大框架
  • Idea集成deepseek生成代码
  • ffmpeg -hwaccels
  • 用 TDD 构建 Rust 命令行搜索功能:以 minigrep 为例
  • 3D文档控件Aspose.3D实用教程: 在 Java 中创建 FBX 文件并无缝将圆柱体转换为网格
  • 企业数据集成案例:吉客云销售渠道到MySQL
  • 率失真理论(Rate-Distortion Theory)和信息瓶颈(Information Bottleneck, IB)
  • Flutter_学习记录_安装第三方包(演示安装 Intl 包)
  • 2025智能名片:AI驱动下的商务社交革命
  • 蓝桥杯C语言组:分治问题研究
  • 本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui
  • Ubuntu安装PgSQL17
  • Prolog语言的云计算
  • 命令行参数和环境变量
  • git服务器搭建,gitea服务搭建,使用systemclt管理服务
  • c版的findcontours改写,输出为vector<vector<cPoint>>
  • Git在不同电脑上使用