【POJ 3320】Jessica's Reading Problemc(尺取法)

题意

P个数,求最短的一段包含P个数里所有出现过的数的区间。

分析

  尺取法,边读边记录每个数出现次数num[d[i]],和不同数字个数n个。

  尺取时,l和r 代表区间两边,每次r++时,d[r]知识点出现次数+1,d[l]知识点出现次数大于1时,次数--,l++,直到d[l]出现次数为1,当不同知识点数量达到n,且区间更小,就更新答案。

代码

#include <cstdio>
#include <map>
using namespace std;

map <int,int> num,v;
int p,l,r,n,cnt;
int d[1000005];
int ans=9999999;

int main()
{
    scanf("%d", &p);
    for (int i = 0; i < p; i++)
    {
        scanf("%d",&d[i]);

        if (num[d[i]]==0)
        {
            n++;
        }

        num[d[i]]++;
    }

    l=0;
    r=0;

    while(l<p && r<p)
    {
        if (v[d[r]]==0)
        {
            cnt++;
        }

        v[d[r]]++;
        r++;

        while (v[d[l]]>1)
        {
            v[d[l]]--;
            l++;
        }
        if (cnt==n && r-l < ans)
        {
            ans=r-l;
        }
    }
    printf("%d",ans);
    return 0;
}

  

你可能感兴趣的:(【POJ 3320】Jessica's Reading Problemc(尺取法))