查找具有最大总和的数组(包含至少两个数字)内的子数组

时间:2017-04-21 05:36:50

标签: algorithm

查找具有最大总和的数组(至少包含两个数字)中的子数组。 例如,给定数组[-2,-1,-3,-4,-1], 连续的子阵列[-2,-1]具有最大的和= -3。 尝试在O(n)时间内完成 后续,如果输入是流,如何解决它 public int maxSubArray(int [] nums){}

3 个答案:

答案 0 :(得分:0)

对于大小为(N)的数组。我们称之为A. 你可以创建另一个数组B,你将存储总和。 现在遍历父数组。

    int max = Integer.MIN;
B[0] = A[0];
    for(i=1;i<A.length;i++)
    {
    if(A[i] > 0){
    B[i]=B[i-1] + A[i];
    }else if(A[i]+B[i-1] > max){
    B[i] = A[i]+B[i-1]
    max = A[i]+B[i-1]
    }
    else{
    B[i] = A[i];
    }

现在,阵列B中的最大数量具有连续子阵列的最大可能总和,但您不知道子阵列。

答案 1 :(得分:0)

您可以修改方式使用Kadane的算法。

你可以找到Kadane'算法here。 (您也将存储子阵列的末尾。)

我们如何修改它?

- &GT;只需跟踪您正在拍摄的窗口大小,即 RIGHT-LEFT&gt; = 1

我认为这对所有数字都有帮助,包括否定。

仍为所有负数(你可以在O(n)中检查)。只需循环 FROM o到N:maximum = max(arr [i] + arr [i + 1],最大值); 只是为了确保案件得到保障。

答案 2 :(得分:0)

这样的事情应该有效:

int maxvalue = int.MIN_VALUE;
for (int i = 0; i < N; i++)
  for (int j = i + 1; j < N; j++) {
    int value = 0;
    for (int x = i; x <= j; x++)
      value += array[x];
    if (value > maxvalue)
      maxvalue = value;
  }
return maxvalue;