还有另一种解决方案O(n)空间复杂度更容易理解:Max double slice sum.但我只是想知道为什么这个O(1)解决方案不起作用.以下是实际代码:
import java.util.*; class Solution { public int solution(int[] A) { long maxDS = 0; long maxDSE = 0; long maxS = A[1]; for(int i=2; i<A.length-1; ++i){ //end at i-index maxDSE = Math.max(maxDSE+A[i],maxS); maxDS = Math.max(maxDS,maxDSE); maxS = Math.max(A[i],maxS + A[i]); } return (int)maxDS; } }
这个想法很简单如下:
>该问题可以作为查找max(A [i] A [i 1] … A [j] -A [m]); 1·; = I< = M< = J< = N-2;而n = A.length;我们称切片中的A [m]缺少元素.
> maxS [i]将保持以当前索引i结束的最大切片;换句话说,= max(A [t] … A [i]);而t <一世;所以当i = 1时; maxS = A [1];请注意,在解决方案中,我们不保留数组,而是保留当前索引的最新maxS(参见上面的代码).
> maxDSE [i]是在i处结束的所有双切片的最大值;换句话说,= max(A [t] A [t 1] … A [i] -A [m]) – 在A [i]处结束; maxDS是我们试图找到的双切片总和的最终最大值.
现在,我们只使用i = 2的for循环; – > I =则为a.length-2;对于每个索引i,我们注意到一些发现:
>如果缺少的元素是A [i],那么maxDSE [i] = maxS [i-1](最大总和
所有以i-1 =>结束的切片;或者A [t] …… A [i] – A [i]);
>如果缺少的元素不是A [i] – >所以它必须在A [1] – > A [i-1] – >的某处. maxDSE = maxDSE [i-1] A [i];例如A [t] … A [i] – A [m](不是A [i]必须是最后一个元素)与t
所以maxDSE [i] = Math.max(maxDSE [i-1] A [i],maxS [i-1]);
maxDS = Math.max(maxDS,maxDSE);最大金额maxDSE;
和maxS [i] = Math.max(A [i],maxS [i-1] A [i]);
通过这种方式,maxDS将是最终结果.
但奇怪的是,我只能得到92%;一个失败的性能测试用例如下所示:
medium_range
-1000,…,1000
错误的答案
得到499499预期499500
有谁可以请教我解决方案中的问题在哪里?谢谢!
解决方法
maxS [i] = Math.max(0,Math.max(A [i] maxS [i-1],A [i]));而0是针对空子阵列的情况(在第i个结束时); Math.max(A [i] maxS [i-1],A [i])是具有至少一个元素的所有切片的最大值(在i-index处结束).完整代码如下:
import java.util.*; class Solution { public int solution(int[] A) { long maxDS = 0; long maxDSE = 0; long maxS = A[1]; for(int i=2; i<A.length-1; ++i){ maxDSE = Math.max(maxDSE+A[i],maxS); maxDS = Math.max(maxDS,maxDSE); maxS = Math.max(0,Math.max(A[i],maxS + A[i])); } return (int)maxDS; } }