题目:受主导的子序列##

题意:序列t至少有2个元素,我们称序列t被数字出现次数最多的元素v主导,且出现次数最多的元素必须是唯一的

你被给予了序列a1, a2, ..., an,计算它的最短受主导子序列,或者说这里没有这种序列

[4, 1, 2, 4, 5, 4, 3, 2, 1]的最短受主导子序列为[4, 5, 4]

链接:(受主导的子序列)[https://codeforces.com/contest/1257/problem/C]

分析:我们可以检查每个相同数字(受主导的元素)的对,求出它们之间的距离,然后在每对距离里取最小值

但是可以有更好的方法,时间复杂度为O(n),我们可以从头开始检查元素,如果出现相同的元素,就求出它们之间的距离,然后将后面的元素作为下一段开始受主导子序列的开头。

证明:每段受主导子序列是两两分明,且里面没有两端相同的元素,否则则会产生更短的受主导子序列

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm> using namespace std; const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;
vector<int> a;
void solve()
{
int n;
cin >> n;
a.resize(n + 1); for (int i = 0; i < n; ++i)
cin >> a[i];
if (n == 1)
{
cout << -1 << endl;
return;
}
int ans = INF;
vector<int> lst(n + 1, -1);//n + 1个 -1 for (int i = 0; i < n; i++) {
if (lst[a[i]] != -1)
ans = min(ans, i - lst[a[i]] + 1);
lst[a[i]] = i;
}
if (ans > n)
ans = -1;
cout << ans << endl;
a.clear();
lst.clear();
} int main()
{
int T;
cin >> T;
for (int i = 1; i <= T; ++i)
{
solve();
} return 0;
}

最新文章

  1. FileStream读写文件【StreamWriter 和 StreamReader】
  2. bzoj2243树链剖分+染色段数
  3. js 把数字转成2 ,8,16进制的方法
  4. [AlwaysOn Availability Groups]DMV和系统目录视图
  5. 递推 hdu 2048
  6. 三:Go编程语言规范-表达式
  7. log4net注意事项
  8. 【avalon】offsetParent
  9. [OC Foundation框架 - 20] 统计代码行数
  10. QT5在VS2013中找不到QtNetwork或QTcpSocket或QTcpSocket等头文件
  11. 基于visual Studio2013解决C语言竞赛题之1067间隔排序
  12. cmd 3389
  13. 树链剖分X2
  14. laravel5单元测试
  15. 20175209 《Java程序设计》第六周学习总结
  16. 关于Socket.IO的知识点记录
  17. python 的基础学习 第九天 文件的操作
  18. 1L - ASCII码排序
  19. MT【81】含参数三次函数因式分解
  20. git clone的时候filename too long解决办法

热门文章

  1. 201871010114-李岩松《面向对象程序设计(java)》第八周学习总结
  2. Comet OJ - 2019国庆欢乐赛 C题 两排房子
  3. 基于R数据分析之常用Package讲解系列--1. data.table
  4. ubuntu18 拨号连接宽带网络方法
  5. 编写 Dockerfile 最佳实践
  6. jQuery简单面试题
  7. 程序员用于机器学习编程的Python 数据处理库 pandas 入门教程
  8. Parallel Feature Pyramid Network for Object Detection
  9. Python-Re正则表达式库
  10. linuxLVM