思路:

刚开始:

利用map来统计长度为k的一段上的数字及其出现次数,不断更新区段位置,减去退出区段的数字的出现次数,加上新出现的数字及其出现次数,每次都从后向前遍历一遍map,如果遇到一个数且出现次数为1,那么他就是当前区段上的最大数(因为map中已排好序),break,当前循环结束。这种方法果然想的太简单,超时

然后:问题出在哪?前面的不断更新和统计都是在log n时间完成的,应该没有问题。如果出现一种情况,在求当前区间最大值的时候,都是出现不止一次的数,就意味着要遍历整个map。

结果:利用set方便求最值,set自身也是一种树形结构,操作在log n内可以完成。因为set的元素不重样,我们只需将map中出现次数为1的数丢进set,每次更新区段时,先看退出的数出现次数是否减少到一,是则丢入set,不是看是不是在set中出现,如果出现就set中erase它,因为它的出现次数不为1,不在比较范围内。先加入元素看出现次数是否唯一,唯一加入set,不唯一看set中是否有,有就删除。再从set中选最大值,即最后一个(set已经排好序),一轮循环结束。

知识点:

set的insert,empty,end(),rend(),rbegin()(反向迭代器,十分方便)

map的[]访问方式

下面是代码:

 #include <iostream>
#include <map>
#include <set>
#include <climits>
#define max_n 100005
using namespace std;
int a[max_n];
map<int,int> num;
set<int> sets;
int n;
int k;
int main()
{
cin >> n >> k;
for(int i = ;i<n;i++)
{
cin >> a[i];
}
for(int i = ;i<k;i++)
{
num[a[i]]++;
if(num[a[i]]==)
{
sets.insert(a[i]);
}
else
{
if(sets.find(a[i])!=sets.end())
{
sets.erase(a[i]);
}
}
}
if(sets.empty())
{
cout << "Nothing" << endl;
}
else
{
auto i = sets.rbegin();
cout << *i << endl;
}
int f = ;
int b = k;
for(;b<n;f++,b++)
{
num[a[f]]--;
num[a[b]]++;
if(num[a[f]]==)
{
sets.insert(a[f]);
}
else
{
if(sets.find(a[f])!=sets.end())
{
sets.erase(a[f]);
}
}
if(num[a[b]]==)
{
sets.insert(a[b]);
}
else
{
if(sets.find(a[b])!=sets.end())
{
sets.erase(a[b]);
}
}
if(sets.empty())
{
cout << "Nothing" << endl;
}
else
{
auto i = sets.rbegin();
cout << *i << endl;
}
/*for(auto i = num.rbegin();i!=num.rend();i++)
{
cout << i->first << "-" << i->second << endl;
}*/
}
}

最新文章

  1. python(6)时间戳和北京时间互转,输出当前的时间和推到七天前的日期
  2. 【转】win7如何设置共享目录,并且访问不需要输入用户名和密码。
  3. java连接远程服务器之manyged-ssh2 (windows和linux)
  4. ExtJs4 学习3 combox自动加载的例子
  5. 全民Scheme(0):lat的定义
  6. 使用windows-SQLyog连接linux-mysql
  7. LightOJ1010---Knights in Chessboard (规律题)
  8. Python 2 中的编码
  9. Chapter 8: Exceptional Control Flow
  10. 实战DeviceIoControl 之四:获取硬盘的详细信息
  11. Deepin中设置文件或文件夹权限
  12. linux下mysql 5.7.22 安装
  13. CSS中隐藏内容的3种方法
  14. node.js初识03
  15. Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子(转载)
  16. How to use jQuery countdown plugin
  17. 使用客户端软件向服务端php程序发送post数据,php接受三种方法
  18. HTTP/1.1 学习
  19. Oracle 执行计划的查看方式
  20. chromium之ScopedNSAutoreleasePool浅析

热门文章

  1. JavaScript 有用的代码片段和 trick
  2. 【Docker学习之四】Docker自定义容器镜像
  3. 利用docker搭建RTMP直播流服务器实现直播
  4. Java生成艺术二维码也可以很简单
  5. SpringBoot应用部署到Docker上(docker-io版本)
  6. [转]matlab GUI 新手入门——最基本的几个概念
  7. Python实现堆
  8. DELPHI6中DSGNINTF.DCU找不到时的解决方法
  9. [cf 1194 D] 1-2-K Game
  10. 过滤器 &amp; 监听器 &amp; 拦截器