双端队列,双指针

思路:

其实很容易想到是双指针或者双端队列。

我们设置一个type表示当前区间已经有了多少种厨师,同时还需要记录区间中每个元素出现的次数,然后比较棘手的是移动问题了,什么时候移动呢?

我们可以发现当区间当队头元素多余时候肯定就要移动了:

统计答案就是在type等于m的时候,只要统计l和r的位置就行了。

为什么这样的移动方式就一定可以让l和r落在最佳的答案区间上?

你可以反推:因为我们的l指向的元素一定是区间中没有多余的元素,那么如果它再右移,则区间非法;如果它不移动,也就是在l的左边,那么这个区间明显不是最佳区间。

#include <bits/stdc++.h>
using namespace std;
const int N=16+5,inf=0x3f3f3f3f;
deque<int>q;
int ans=inf;
int n,m,a[N],cnt[2001],l,r,type;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(!cnt[a[i]])type++;
		cnt[a[i]]++;
		q.push_back(i);//新元素进入队尾
		while(!q.empty()&&cnt[a[q.front()]]>1){//队头多余时候就移动
			cnt[a[q.front()]]--;q.pop_front();
		}
		if(type==m){//因为种类最多m,达到m时候就一直更新答案就行
			if(q.size()<ans){
				ans=q.size();l=q.front();r=q.back();
			}
		}
	}
	cout<<l<<" "<<r;
}

相关推荐

  1. STL之deque 【队列

    2024-07-10 09:10:04       64 阅读
  2. 641. 设计循环队列

    2024-07-10 09:10:04       67 阅读
  3. 队列,LeetCode 2810. 故障键盘

    2024-07-10 09:10:04       39 阅读
  4. 03-3.2.4 队列

    2024-07-10 09:10:04       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 09:10:04       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 09:10:04       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 09:10:04       90 阅读
  4. Python语言-面向对象

    2024-07-10 09:10:04       98 阅读

热门阅读

  1. 系统架构设计师——网络设计

    2024-07-10 09:10:04       33 阅读
  2. SSL证书到期自动巡检脚本-推送钉钉告警

    2024-07-10 09:10:04       30 阅读
  3. 如何才能在Linux下编写驱动程序

    2024-07-10 09:10:04       28 阅读
  4. Tomcat打破双亲委派模型的方式

    2024-07-10 09:10:04       32 阅读
  5. C++惯用法: 通过std::decltype来SFINAE掉表达式

    2024-07-10 09:10:04       24 阅读
  6. HTTP 范围Range请求

    2024-07-10 09:10:04       28 阅读
  7. React 开发报错整理

    2024-07-10 09:10:04       36 阅读
  8. 微软 Edge 浏览器全解析

    2024-07-10 09:10:04       27 阅读
  9. 静态搜索iOS动态链接函数的调用位置

    2024-07-10 09:10:04       26 阅读