一尘不染

最大双片和

algorithm

最近,我尝试解决codility中的Max Double Slice Sum问题,这是max
slice问题的一种变体。我的解决方案是在取出最小值时寻找具有最大值的切片。所以我实现了最大切片,但是在当前切片上取出了最小数目。

我的分数是100分的61分,因为它在某些测试中未通过,主要是在包括负数和位置数的阵列测试中。

您能帮我弄清楚为什么代码失败或是否有更好的解决方案吗?

问题如下:

A non-empty zero-indexed array A consisting of N integers is given.
A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.
The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1]+ A[Y + 1] + A[Y + 2] + ... + A[Z − 1].
For example, array A such that:
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
contains the following example double slices:
 double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,
 double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,
 double slice (3, 4, 5), sum is 0.
The goal is to find the maximal sum of any double slice.
Write a function:
class Solution { public int solution(int[] A); }
that, given a non-empty zero-indexed array A consisting of N integers, returns the maximal sum of any double slice.
For example, given:
 A[0] = 3
 A[1] = 2
 A[2] = 6
 A[3] = -1
 A[4] = 4
 A[5] = 5
 A[6] = -1
 A[7] = 2
the function should return 17, because no double slice of array A has a sum of greater than 17.
Assume that:
 N is an integer within the range [3..100,000];
 each element of array A is an integer within the range [−10,000..10,000].
Complexity:
 expected worst-case time complexity is O(N);
 expected worst-case space complexity is O(N), beyond input storage (not counting the    storage required for input arguments).
Elements of input arrays can be modified.
Copyright 2009–2013 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

我的代码如下:

public class Solution {
    public int solution(int[] A) {
        int currentSliceTotal=0; 
        Integer currentMin=null, SliceTotalBeforeMin =0;
        int maxSliceTotal= Integer.MIN_VALUE;
        for(int i= 1; i<A.length-1; i++){
            if( currentMin==null || A[i] < currentMin ){
                if(currentMin!=null ){
                    if(SliceTotalBeforeMin+currentMin <0){
                        currentSliceTotal-=SliceTotalBeforeMin;
                    } else {
                        currentSliceTotal += currentMin;
                    }
                }                
                currentMin = A[i];
                SliceTotalBeforeMin  =currentSliceTotal;

                if( SliceTotalBeforeMin<0){
                    SliceTotalBeforeMin = 0;
                    currentMin = null;
                    currentSliceTotal = 0;
                }
            } else {
                currentSliceTotal+= A[i];
            }

            maxSliceTotal = Math.max(maxSliceTotal, currentSliceTotal);
        }

        return maxSliceTotal;
    }
}

阅读 161

收藏
2020-07-28

共1个答案

一尘不染

如果我已正确理解问题,则要计算缺少一个元素的最大和子数组。

您的算法不适用于以下情况:

 1 1 0 10 -100 10 0

在上述情况下,您的算法应标识1, 1, 0, 10为最大和子数组,而忽略0以给出12作为输出。但是,1, 1, 0, 10, -100, 10省略之后,您可以作为答案-100

您可以使用修改形式的Kadane算法,该算法计算以每个索引结尾的MAX Sum子数组。

  1. 对于每个索引,请max_sum_ending_at[i]使用Kadane算法向前计算该值。
  2. 对于每个索引,请max_sum_starting_from[i]使用反向的Kadane算法计算值。
  3. 同时迭代这些数组,然后选择最大值为“ Y”的

max_sum_ending_at [Y-1] + max_sum_starting_from [Y + 1]

2020-07-28