4
7
3 1 5 2 1 3 4
6
1 1 1 1 1 1
6
1 4 2 8 5 7
2
15 15
4
5
-1
1
题意:找出两个相同长度的子段,要求是至少有一个对应位置数字相同。求子段最长为多少。
算法:无
问题:一开始想暴力算,tle了,尝试剪枝,多过了一个test还是tle了。。
思路: 就是求相同数字的最短间隔。在输入时用数组保存该数字出现的位置,下一次出现时计算出差值,与Min比较即可。
代码:ac
#include<bits/stdc++.h>
using namespace std;
int n;
int a[150010];
int q[150010];//存放上一次该数字出现的位置
void solve()
{
memset(q, 0, sizeof(q));
cin >> n;
int Min = 150010;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (q[a[i]])Min = min(Min, i - q[a[i]]);
q[a[i]] = i;
}
if (Min == 150010)cout << "-1" << endl;
else cout << n - Min << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int tt;
cin >> tt;
while (tt--)solve();
return 0;
}