最长连续子序列
题目描述:
有 N 个正整数组成的一个序列。
给定整数 sum,求长度最长的连续子序列,使他们的和等于 sum,返回此子序列的长度,
如果没有满足要求的序列,返回-1。
输入输出描述:
输入描述:
第一行输入是:N个正整数组成的一个序列
第二行输入是:给定整数sum
输出描述:
最长的连续子序列的长度
备注:
输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔
序列长度:1 <= N <= 200
输入序列不考虑异常情况
示例1:
输入:
1,2,3,4,2
6
输出:
3
说明:
1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3
示例2:
输入:
1,2,3,4,2
20
输出:
-1
说明:
解释:没有满足要求的子序列,返回-1
解题思路:
维护一个滑动窗口:
1、先扩将窗口右边界右移,让窗口中的总和 >= target
2、若窗口中的总和刚好等于target,则尝试更新答案
3、再将窗口左边界右移,让窗口中的总和 < target
4、重复上面的1、2、3直到滑动窗口的右边界移出了数组的边界
代码:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] array = Arrays.stream(scanner.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
int target = Integer.parseInt(scanner.nextLine());
int sum = 0;
int n = array.length;
int max = -1;
// 维护一个长度不固定的窗口,根据窗口中的总和缩小或者扩大窗口
int left = 0;
int right = 0;
while (right < n) {
// 窗口右边界右移,让窗口中的总和大于等于target
while (right < n && sum < target) {
sum += array[right++];
}
// 如果窗口中的总和刚好等于目标值,则尝试更新最长的窗口
if (sum == target) {
max = Math.max(max, right - left);
}
// 窗口左边界左移,直到窗口中的元素总和小于 target
while (sum >= target && left < right) {
sum -= array[left++];
}
}
// 结果输出
System.out.println(max);
}