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; //快指针移动
}
}
}
}
}
}
浙公网安备 33010602011771号