poj3320Jessica's Reading Problem—尺取法(java)
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的poj3320Jessica's Reading Problem—尺取法(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1181变形课dfs/bfs/并查
- 下一篇: poj2566Bound Found尺取