码题集OJ-世界警察 (matiji.net)
双指针
思路是这样的,首先r指针向右走,如果r指针遇到了和l指针一样的,那么l指针就++,一直加到r指针的位置,此时a[l]==a[r],然后l指针再往下跳一个
绿色指针是r指针,红色指针是左指针:
mp[1]没有出现过,mp[1]++,r++,cnt++:
此时mp[1]=1,重复了,所以要剔除,l指针向右挪动,又因为a[l]=a[r],所以我们只需要挪一次。 mp[1]--,l++,cnt--:
此时哈希表已经空了,r指针继续右移:
!mp[1],mp[1]++,r++,cnt++:
!mp[2],mp[2]++,r++,cnt++:
!mp[3],mp[3]++,r++,cnt++:
!mp[4],mp[4]++,r++,cnt++:
code
#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;
}
import java.util.HashMap; //HashMap在util这个包下面
import java.util.Scanner; //读入在util这个包下面
public class case4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //new一个Scanner对象
int n = scanner.nextInt();
int[] ints = new int[n];
HashMap<Integer, Integer> hashMap = new HashMap<>();
int ans = 0;
int cnt = 0;
for (int i = 0; i < n; i++) {
ints[i] = scanner.nextInt();
}
int l = 1;
int r = 1;
while (l <= r && r < ints.length){
if(!hashMap.containsKey(ints[r])){ //containsKey用来检查指定的key值是否存在
hashMap.put(ints[r],ints[r]); //压入哈希表
r++;
cnt++;
ans = Math.max(ans,cnt);
}else {
while (ints[l] != ints[r]){
hashMap.remove(ints[l]); //弹出哈希表
l++;
cnt--;
}
hashMap.remove(ints[l]);
l++; cnt--;
}
}
System.out.println(ans);
}
}