最长连续子序列
题目描述
有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度,
如果没有满足要求的序列,返回-1。
输入描述
第一行输入是:N个正整数组成的一个序列
第二行输入是:给定整数sum
输出
最长的连续子序列的长度
备注
- 输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔
- 序列长度:1 <= N <= 200
- 输入序列不考虑异常情况
用例
输入 | 1,2,3,4,2 |
输出 | 3 |
说明 | 1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3。 |
输入 | 1,2,3,4,2 20 |
输出 | -1 |
说明 | 没有满足要求的子序列,返回-1 |
解析
简单的双指针问题 具体逻辑看代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class T53 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
int sum = Integer.parseInt(sc.nextLine());
List<Integer> numList = new ArrayList<>();
Arrays.stream(input.split(",")).forEach(s -> {
numList.add(Integer.parseInt(s));
});
int left = 0;
int right = 0;
int tempSum = numList.get(left);// 临时的区间和
int len = -1;
while (right < numList.size() - 1) {
if (tempSum < sum) {
right++;
tempSum += numList.get(right);
//System.out.println(tempSum);
} else if (tempSum > sum) {
left = right;
tempSum = 0;
} else {
if (len < right - left) {
len = right - left + 1;
}
left++;
tempSum = 0;
}
}
System.out.println(len);
}
}
代码运行示意图