Max double slice sum

前端 未结 14 1124
后悔当初
后悔当初 2020-12-13 20:53

Recently, I tried to solve the Max Double Slice Sum problem in codility which is a variant of max slice problem. My Solution was to look for a slice that has maximum value w

相关标签:
14条回答
  • 2020-12-13 20:54

    The most clear Python solution among others:

    def solution(A):
        mid = 1
        total = 0
        max_slice = 0
    
        for idx, end in enumerate(A[2:-1], start=2):
    
            if total < 0:
                mid = idx
                total = 0
    
            elif total == 0 and A[idx - 1] > A[mid]:
                mid = idx - 1
                total = end
    
            else:
                if A[mid] > end:
                    total += A[mid]
                    mid = idx
                else:
                    total += end
    
            max_slice = max(max_slice, total)
    
        return max_slice
    
    0 讨论(0)
  • 2020-12-13 20:55

    Hello this implementacion has 100 score

    int i,n ;
    
    n = A.size();
    
    if (3==n) return 0;
    
    vector<int>  max_sum_end(n,0);
    vector<int>  max_sum_start(n,0);
    
    for (i=1; i< (n-1); i++) // i=0 and i=n-1 are not used because x=0,z=n-1
    {
      max_sum_end[i]   = max ( 0 , max_sum_end[i-1] + A[i]  ); 
    }
    
    for (i=n-2; i > 0; i--) // i=0 and i=n-1 are not used because x=0,z=n-1
    {
       max_sum_start[i]   = max ( 0 , max_sum_start[i+1] + A[i]  ); 
    }  
    
    int maxvalue,temp;
    maxvalue = 0;
    
    for (i=1; i< (n-1); i++)
    {
     temp = max_sum_end[i-1]  + max_sum_start[i+1];
     if ( temp >  maxvalue) maxvalue=temp;
    }
    
    return maxvalue ;
    
    0 讨论(0)
  • 2020-12-13 20:55

    C# solution 100/100

    public int solution(int[] A) {
            int[] forw = new int[A.Length];
            int[] rewi = new int[A.Length];
    
            bool isAllNeg = true;
            for (int i = 1; i < A.Length; i++)
            {
                forw[i] = Math.Max(0, forw[i - 1] + A[i]);
                if (A[i] > 0 && isAllNeg) isAllNeg = false;
    
            }
    
            if (isAllNeg)
                return 0;
    
            for (int i = A.Length - 2; i >= 0; i--)
            {
                rewi[i] = Math.Max(0, rewi[i + 1] + A[i]);
            }
    
            int maxsum = 0;
            for (int i = 1; i < A.Length - 1; i++)
            {
                maxsum = Math.Max(maxsum, forw[i - 1] + rewi[i + 1]);
            }
    
            return maxsum;
    }
    
    0 讨论(0)
  • 2020-12-13 20:58

    Vb.net version of the above solution is as below:

    Private Function solution(A As Integer()) As Integer
        ' write your code in VB.NET 4.0
        Dim Slice1() As Integer = Ending(A)
            Dim slice2() As Integer = Starting(A)
            Dim maxSUM As Integer = 0
            For i As Integer = 1 To A.Length - 2
                maxSUM = Math.Max(maxSUM, Slice1(i - 1) + slice2(i + 1))
            Next
            Return maxSUM
    End Function
        Public Shared Function Ending(input() As Integer) As Integer()
            Dim result As Integer() = New Integer(input.Length - 1) {}
            result(0) = InlineAssignHelper(result(input.Length - 1), 0)
            For i As Integer = 1 To input.Length - 2
                result(i) = Math.Max(0, result(i - 1) + input(i))
            Next
            Return result
        End Function
        Public Shared Function Starting(input() As Integer) As Integer()
            Dim result As Integer() = New Integer(input.Length - 1) {}
            result(0) = InlineAssignHelper(result(input.Length - 1), 0)
            For i As Integer = input.Length - 2 To 1 Step -1
                result(i) = Math.Max(0, result(i + 1) + input(i))
            Next
            Return result
        End Function
            Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
                target = value
                Return value
            End Function
    

    View result on codility

    0 讨论(0)
  • 2020-12-13 20:59

    Javascript implementation based on Abhishek Bansal's solution.100/100 on Codility.

    function solution(A) {
    
      let maxsum=0;
      let max_end_at=Array(A.length);
      let max_start_at=Array(A.length);
      max_end_at[0]=max_start_at[A.length-1]=max_end_at[A.length-1]=max_start_at[0]=0;
      let {max}=Math;
      for(let i=1;i<A.length-1;i++){
    
      max_end_at[i]=max(0,max_end_at[i-1]+A[i]);
       }
    
      for(let n=A.length-2;n>0;n--){
    
      max_start_at[n]=max(0,max_start_at[n+1]+A[n]);
       }
    
      for(let m=1;m<A.length-1;m++){
    
        maxsum=max(maxsum,max_end_at[m-1]+max_start_at[m+1]);
    
        }
    return maxsum;
    }
    
    0 讨论(0)
  • 2020-12-13 21:04

    Using the idea from http://en.wikipedia.org/wiki/Maximum_subarray_problem and Abhishek Bansal's answer above. 100% test pass:

    public class Solution {
    
    public int solution(int[] A) {
        int[] maxEndingHere = maxEndingHere(A);
        int[] maxStartingHere = maxStartingHere(A);
        int maxSlice = 0;
        for (int i = 1; i < A.length-1;i++) {
          maxSlice = Math.max(maxSlice, maxEndingHere[i-1]+maxStartingHere[i+1]);
        }
        return maxSlice;
    }
    
    
    /**
     * Precalculate ending subarrays. Take into account that first and last element are always 0
     * @param input
     * @return
     */
    public static int[] maxEndingHere(int[] input) {
        int[] result = new int[input.length];
        result[0] = result[input.length-1] = 0;
        for (int i = 1; i < input.length-1; i++) {
            result[i] = Math.max(0, result[i-1] + input[i]);
        }
        return result;
    }
    
    /**
     * Precalculate starting subarrays. Take into account that first and last element are always 0
     * @param input
     * @return
     */
    public static int[] maxStartingHere(int[] input) {
        int[] result = new int[input.length];
        result[0] = result[input.length-1] = 0;
        for (int i = input.length-2; i >= 1; i--) {
            result[i] = Math.max(0, result[i+1] + input[i]);
        }
        return result;
    }
    

    }

    0 讨论(0)
提交回复
热议问题