双指针|双指针 + 滑动窗口 寒假每日一题 品种邻近
题目:
农夫约翰的 N 头奶牛排成一排,每头奶牛都用其品种 ID 进行描述。
如果两头相同品种的牛靠得太近,它们就会吵架。
具体的说,如果同一品种的两头奶牛在队列中的位置相差不超过 K,我们就称这是一对拥挤的牛。
【双指针|双指针 + 滑动窗口 寒假每日一题 品种邻近】请计算品种 ID 最大的拥挤奶牛对的品种 ID。
输入格式
第一行包含两个整数 N 和 K。
接下来 N 行,每行包含一个整数表示队列中一头奶牛的品种 ID。
输出格式
输出品种 ID 最大的拥挤奶牛对的品种 ID。
如果不存在拥挤奶牛对,则输出 ?1。
数据范围
1≤N≤50000,
1≤K
分析:这道题应该怎么考虑呢,首先我们要知道的是我们要去找的是拥挤奶牛对中品种ID最大的,这里有两个点:首先我们要去找最大,所以肯定要定义一个ans去取max ; 并且,我们要去找拥挤的奶牛,自然要让我们的双指针始终在一个“拥挤的状态下”;
至于为什么要用双指针,考虑到这是一个一眼看过来就是的滑动窗口问题,我们肯定要用双指针啊!
然后我们就考虑,我们在遍历这样的一个序列的时候是怎么样来分辨这个窗口中是否有拥挤奶牛对的,我们肯定不能对每一个窗口就拿一个去硬怼,所以我们会想到map的映射,也会想到单调队列的出队,我们提取其中重要的部分就是,每读入一个新元素,我们就要让它对应的映射值加一,如果这个映射值 == 2了,说明前面一定有一个同样的值出现,所以肯定新元素是拥挤的,我们就用max去判断;那么我们需要注意了,为了保证一定要在同一个窗口中,所以当窗口移动时,队首的点就要自觉离开,并将其映射值减一,以免产生影响;
所以我们开辟了一个cnt数组,但还要注意了,cnt数组的下标和arr的值时一一对应的,所以其范围要适配arr的值,要开到10^6以上!
综上,我们要熟悉这种做题方式!
推荐阅读
- c语言指针超出范围怎么办,【C语言指针】两篇文章彻底搞懂指针终篇——彻底瓦解C语言指针的难点...
- C语言学习教程|C语言指针进阶-全面分析C指针重难点逐一突破(终篇)
- 利用Java+Selenium+OpenCV模拟实现网页滑动验证
- 剑指offer|剑指 Offer第 11 天 双指针(简单)
- 《C++要笑着学》|【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针
- Java|摸个鱼的功夫,搞懂双亲委派机制
- spring|spring boot下mybatis配置双数据源的实例
- 程序员|Android面试反思(开发5年crud背景,惨遭字节阿里双挂,Android已死)
- petite-vue源码剖析-双向绑定`v-model`的工作原理
- C++Smart|C++Smart Pointer 智能指针详解