2023年码题杯 世界警察 题型:双指针

99 阅读2分钟

码题集OJ-世界警察 (matiji.net)

双指针

思路是这样的,首先r指针向右走,如果r指针遇到了和l指针一样的,那么l指针就++,一直加到r指针的位置,此时a[l]==a[r],然后l指针再往下跳一个

绿色指针是r指针,红色指针是左指针:

image.png

mp[1]没有出现过,mp[1]++,r++,cnt++:

image.png

此时mp[1]=1,重复了,所以要剔除,l指针向右挪动,又因为a[l]=a[r],所以我们只需要挪一次。 mp[1]--,l++,cnt--:

image.png

此时哈希表已经空了,r指针继续右移:

!mp[1],mp[1]++,r++,cnt++: image.png

!mp[2],mp[2]++,r++,cnt++: image.png

!mp[3],mp[3]++,r++,cnt++: image.png

!mp[4],mp[4]++,r++,cnt++: image.png

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);
    }
}