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