一道算法题
求出满足条件的连续子序列的最大长度
- 题目
给定一个k值,给定一个整型数组,求出子数组之和等于k值的子序列最大长度。
要求子数组必须是连续的。例如[1,-5,0]就不是[1,-5,-2,0]的子序列。
如果没有满足条件的子序列就返回0。
- 测试用例1:
输入 [1,-5,-2,0] k=1
输出 1(满足条件的子序列是[1] )
- 测试用例2:
输入[1,3,-1,-2,4] k=4
输出2 (满足条件的子序列是[1,3] [4])
- 思路:
先写出一个数组的所有子序列,如[1,-5,-2,0]观察可知…
先求出数组元素的和,去判断是否等于k值,不满足,再求出次长度的子序列的和,如果有等于k的,那么这个子序列的长度就是满足条件的最大长度。
数组的子序列,可以是一个元素,两个元素…
因为要求最大长度,所以遍历时先遍历长度最大的子序列。
题目给了要求,子序列元素和要等于k值,所以,可以用这个条件去过滤数据。
不需要将所有的子序列都找到(找到的需要存起来,太占内存啦),然后计算每个子序列的和,然后找到满足条件的子序列,然后求出满足条件的子序列的最大长度。
为了节约空间,降低空间复杂度,所以能不开辟空间存数据就不存数据。
多理解题目,将里面的要求和条件反复思考,巧妙利用里面的条件过滤数据,避免写出时间复杂度和空间度很高的程序!!!
public class Main {
public static void main(String[] args) {
int[] arr={5,8,1,3};
int k=2;
System.out.println(maxLen(arr,k));
}
public static int maxLen(int[] arr,int input){
int len=arr.length;
int result=0;//
for(int j=len;j>=1;j--){
int a=0;
int b=a+j-1;
while(b<=len-1){
int sum=0;
for(int i=a;i<=b;i++){
sum+=arr[i];
}
if(input==sum){
return j;
}else{
sum=0;
}
a++;
b++;
}
}
return result;
}
}