POJ 3061 - Subsequence - 快慢指针

POJ 3061 - Subsequence

描述
给出了N个正整数的序列(10 < N < 100 000),每个正整数小于或等于10000,一个正整数S(S<100000)。
写一个程序求序列中连续元素的子序列的最小长度,其和大于或等于S。

输入
第一行是测试用例的数量。
对于每个测试用例,程序必须从第一行读取数字N和S,用间隔隔开。
序列号在测试用例的第二行中给出,用间隔隔开。输入将在文件结束时完成。

输出
对于每种情况,程序必须在输出文件的单独一行打印结果。如果没有答案,则打印0。

 

package basic_data_structure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * 
 * @author XA-GDD
 *
 ** 思路: 快慢指针
 *
 */
public class A_Subsequence {

	static int [] srcArr=new int[100000];
	static int T,N,S;
	static int [] lenArr=new int[100000];
	static int ans;
	public static void main(String[] args) throws IOException {		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		T =  Integer.parseInt(st.nextToken());
		for(int testCase=1;testCase<=T;testCase++) {
			ans = 0;
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			S = Integer.parseInt(st.nextToken());
			st = new StringTokenizer(br.readLine());
			Arrays.fill(srcArr, 0);
			for(int i=0;i<N;i++) {
				srcArr[i] = Integer.parseInt(st.nextToken());
			}
			Arrays.fill(lenArr, Integer.MAX_VALUE);
			getMinLength();
			Arrays.sort(lenArr);
			ans	= lenArr[0]==Integer.MAX_VALUE?0:lenArr[0];
			System.out.println(ans);
		}
		
	}
	
	static void getMinLength() {
		int len=1;
		int index = 0;
		int sum = srcArr[0];		
		int fastIdx = 1;
		for(int i=0;i<N;i++) {	//慢指针
			for(int j=fastIdx;j<=N;j++) {  //快指针								
				if(sum>=S) { //移左边慢指针,sum-左边的值					
					sum -= srcArr[i];
					lenArr[index]=len; 
					index++;
					len--; //长度-
					break;	//慢指针移动			
				}else { //移右边快指针,sum+右边的值
					if(j<N) {
						sum += srcArr[j];					
						fastIdx++;
						len++; //长度+
						continue;	//快指针移动			
					}
				}			
			}
		}
		
	}

}

  

上一篇:学习记录_1126


下一篇:ZZULIOJ 1126: 布尔矩阵的奇偶性