前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【POJ 3320】Jessica's Reading Problemc(尺取法)

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

作者头像
饶文津
发布2020-06-02 14:42:42
3500
发布2020-06-02 14:42:42
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

题意

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

分析

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

  尺取时,l和r 代表区间两边,每次r++时,d[r]即r的出现次数+1,d[l]即l的出现次数大于1时,左边可以短一点,d[l]--,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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档