加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Max Double Slice Sum codility O(1)空间复杂性失败性能

发布时间:2020-12-15 04:25:42 所属栏目:Java 来源:网络整理
导读:我试图弄清楚为什么下面的解决方案在代码网站中的“Max Double Slice Sum”问题的单个性能测试案例中失败了: https://codility.com/demo/take-sample-test/max_double_slice_sum 还有另一种解决方案O(n)空间复杂度更容易理解:Max double slice sum.但我只
我试图弄清楚为什么下面的解决方案在代码网站中的“Max Double Slice Sum”问题的单个性能测试案例中失败了: https://codility.com/demo/take-sample-test/max_double_slice_sum

还有另一种解决方案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

有谁可以请教我解决方案中的问题在哪里?谢谢!

解决方法

好的,我发现我的代码出错了.似乎我忘了一个角落的案例.当计算DSE [i]时,在A [i]缺少数字的情况下,maxS应该包含数组为空时的情况.换句话说,maxS应计算为:
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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读