题意:
删除某一段最小长度的连续子序列,使得剩余的序列中不存在重复元素
错误解题思路:
? 分情况讨论,4种方法
?1.删除序列左边的子序列
2.删除序列右边的子序列
3.删除中间的子序列
? ?(1)先从前往后查找到重复元素,再从后往前取没有重复的元素
? ?(2)先从后往前查找到重复元素,再从前往后取没有重复的元素
错误代码:
wa在了第54个测试用例
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
int main(){
int n;
cin >> n;
int l = 1, r = n, ans = 100005;
int a[2005];
map<int, int> mp, mpb;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
for(int i = 1; i <= n; i++) {
mp[a[i]]++;
if(mp[a[i]] > 1) {
l = i;
ans = min(ans, n - l + 1); // 从左往右
// cout << "ans1 = "<< ans << " n = " << n << " l=" << l << endl;
for(int j = n; j > i; j--) {
mp[a[j]]++;
if(mp[a[j]] > 1) {
ans = min(ans, j - l + 1); // 从右往左,获取没有重复的元素
// cout << "ans2 = "<< ans << endl;
break;
}
}
break;
}
}
for(int i = n; i > 0; i--) {
mpb[a[i]]++;
if(mpb[a[i]] > 1) {
r = i;
ans = min(ans, r); // 从右往左
// cout << "ans3 = "<< ans << " n = " << n << " r=" << r << endl;
for(int j = 1; j <= i; j++) {
mpb[a[j]]++;
if(mpb[a[j]] > 1) {
ans = min(ans, r - j + 1); // 从左往右,获取没有重复的元素
// cout << "ans4 = "<< ans << endl;
break;
}
}
break;
}
}
if(ans == 100005) {
ans = 0;
}
cout << ans << endl;
return 0;
}
欢迎大佬指教错误啊