[笔试题]找数组中最长和为0连续子序列

来源:互联网 发布:网络球机控制线接线图 编辑:程序博客网 时间:2024/06/14 01:01


输入:int 型数组由正数、负数、0组成

输出:最长和为0的子序列


例:

输入:[3,0,-1,-2,-3,1,1,1,2,3,1,-2,-1]

输出:9


思路:原数组为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; }

0 0
原创粉丝点击