poj3320Jessica's Reading Problem—尺取法(java)

题目链接

大意:给序列数字,找出最小子序列,包含所有的元素类型。例如
5
1 8 8 8 1
输出2,因为1 8就包含了所有元素

思路:尺取法

  • 这个和裸的尺取优点不同的是,他需要一个map来维护判断而不是sum维护判断。在右侧从左向右遍历的同时,用一个map<Integer,Integer>来维护元素,map.keyset()就可以判断是否包含所有元素,数值用来判断改元素出现次数是否应移除改元素—左侧标记右移的时候判断。
  • 所以具体的解题方法是:left,right=0,right向右遍历,向map中添加元素(数量等信息),如果包含了所有元素,那么left右移,对应改变map,一直到map不包含所有为止。然后右侧继续—

附上代码:

package 暴力;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class poj3320 {

	public static void main(String[] args) throws IOException {
		// TODO 自动生成的方法存根
		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
		in.nextToken();int p=(int)in.nval;
		int value[]=new int[p];
		Map<Integer, Integer>map=new HashMap<Integer,Integer>();
		Set<Integer>set=new HashSet<Integer>();
		for(int i=0;i<p;i++)
		{
			in.nextToken();
			value[i]=(int)in.nval;
			set.add(value[i]);
		}
		int l=0;int len=p-1;
		map.put(value[0], 1);
		for(int i=1;i<p;i++)
		{
		   if(map.containsKey(value[i])) {map.put(value[i], map.get(value[i])+1);}
		   else map.put(value[i],1);
		   while(map.keySet().size()==set.size()) {
			   if(i-l<=len) {len=i-l;}
			   if(map.get(value[l])>1) {map.put(value[l], map.get(value[l])-1);}
			   else map.remove(value[l]);
			   if(l<i)
			   l++;
			   
		   }
		}
	    out.println(len+1);
		out.flush();
	}

}

  • 如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bigsai

喝杯咖啡压压惊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值