输入:int 型数组由正数、负数、0组成
输出:最长和为0的子序列
例:
输入:[3,0,-1,-2,-3,1,1,1,2,3,1,-2,-1]
输出:12
思路:原数组为A,长度为N
新建一个数组B[1...N+1],B[i]=A[i-1]+A[i-2]+A[1],B[1]=0 时间复杂度为O(n)
将问题转化为求B数组两个相同数字最远距离 时间复杂度可能为O(n^2)
private static int find(int[] arr) {
int[] arr1 = new int[arr.length + 1];
//创建求和串,为了考虑整个串和为0,将首项设置为0;
arr1[0] = 0;
for (int x = 0; x < arr.length; x++) {
arr1[x+1] = arr[x]+arr1[x];
}
int arr2[] = new int [arr.length];
//寻找两个相同数字最大距离,从后向前,找到就ok
for(int i = 0;i<arr.length;i++){
arr2[i]=0;
//剩下的如果没有已找到的长,就不找了
if(i!=0&&arr2[i-1]>arr.length-i){
break;
}
for(int j =arr.length;j>=0;j--){
if(arr1[i]==arr1[j]){
arr2[i]=j-i;
break;
}
}
}
//找最大值
int max = 0;
for(int x =0;x<arr2.length;x++){
if(arr2[x]>max){
max=arr2[x];
}
}
return max;
}