https://www.matiji.net/exam/brushquestion/4/4446/16A92C42378232DEB56179D9C70DC45C
双指针
思路是这样的,首先r指针向右走,如果r指针遇到了和l指针一样的,那么l指针就++,一直加到r指针的位置,此时a[l]==a[r],然后l指针再往下跳一个
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
map<int, int> mp;
int n,ans,cnt;
int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int l = 1, r = 1;while (l <= r && r <= n){if (!mp[a[r]]) //如果后面碰到的元素前面没有出现过{mp[a[r]]++, r++, cnt++; //加入到map种中,右指针继续向右移动,计数器++ans = max(ans,cnt);}else //如果后面碰到的元素前面出现过{while (a[l] != a[r]) {mp[a[l]]--, l++, cnt--; //把前面重复元素删去,左指针向右移动,计数器--}mp[a[l]]--, l++, cnt--; //l指针一直走到r指针位置后,l指针再往后跳一个位置 }}cout << ans << endl;return 0;
}```cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
map<int, int> mp;
int n,ans,cnt;
int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int l = 1, r = 1;while (l <= r && r <= n){if (!mp[a[r]]) //如果后面碰到的元素前面没有出现过{mp[a[r]]++, r++, cnt++; //加入到map种中,右指针继续向右移动,计数器++ans = max(ans,cnt);}else //如果后面碰到的元素前面出现过{while (a[l] != a[r]) {mp[a[l]]--, l++, cnt--; //把前面重复元素删去,左指针向右移动,计数器--}mp[a[l]]--, l++, cnt--; //l指针一直走到r指针位置后,l指针再往后跳一个位置 }}cout << ans << endl;return 0;
}