最长连续子序列
题目描述
有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()) {
if (tempSum < sum) {
right++;
if (right == numList.size())
break;// 超出了
tempSum += numList.get(right);
// System.out.println(tempSum);
} else if (tempSum > sum) {
tempSum -= numList.get(left);
left++;
} else {
// System.out.println(right - left + "-");
// System.out.println(right + "-----" + left);
if (len < right - left) {
len = right - left + 1;
}
tempSum -= numList.get(left);
left++;
}
}
System.out.println(len);
}
}
代码运行示意图
文章来源地址https://www.toymoban.com/news/detail-485374.html
到了这里,关于华为OD机试之最长连续子序列(Java源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!