Max double slice sum

前端 未结 14 1126
后悔当初
后悔当初 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 21:18

    If I have understood the problem correctly, you want to calculate the maximum sum subarray with one element missing.

    Your algorithm shall not work for the following case:

     1 1 0 10 -100 10 0
    

    In the above case, your algorithm shall identify 1, 1, 0, 10 as the maximum sum sub array and leave out 0 to give 12 as the output. However, you can have 1, 1, 0, 10, -100, 10 as the answer after leaving out -100.

    You can use a modified form of Kadane's algorithm that calculates the MAX Sum subarray ending at each index.

    1. For each index, calculate the max_sum_ending_at[i] value by using Kadane's algorithm in forward direction.
    2. For each index, calculate the max_sum_starting_from[i] value by using Kadane's algorithm in reverse direction.
    3. Iterate these arrays simultaneously and choose the 'Y' that has the maximum value of

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

    0 讨论(0)
  • 2020-12-13 21:21

    Without using extra memory, 100/100 C++:

    #include <algorithm>
    
    int solution(vector<int> &A) {
        int max_slice = 0;
        int max_slice_i = 0;
    
        int min_val = 0;
    
        int mss = 0;
        int mse = 0;
    
        int s = 1;
    
        int msmv = 0;
    
        int max_slice_i_orig = 0;
        int os = 1;
    
        for(size_t i = 1;i < A.size() - 1;i++)
        {
            int v = max_slice_i;
    
            if(max_slice_i > 0 && A[i] < 0)
            {
                if(A[i] < min_val)
                {
                    v = max_slice_i_orig;
                    s = os;
                    min_val = std::max(A[i], -max_slice_i_orig); 
                } else
                {
                    v = max_slice_i + A[i];               
                }                        
            } else
            {
                v = max_slice_i + A[i];
            }
    
            int new_orig_v = max_slice_i_orig + A[i];
            if(new_orig_v < 0)
            {
                max_slice_i_orig = 0;
                os = i + 1;
            } else
            {
                max_slice_i_orig = new_orig_v;
            }
    
            if(v > 0)
            {                    
                max_slice_i = v;                                   
            } else {            
                max_slice_i = 0;
                min_val = 0;
                s = i + 1;
            }
    
            if(max_slice_i > max_slice)        
            {
                mss = s;
                mse = i;
                msmv = min_val;
                max_slice = max_slice_i;
            }
        }
    
        // if all are positive
        if(msmv == 0)
        {
            if(mss == 1 && mse == A.size() - 2)
            {
                int min = 10001;
                for(int j = mss;j <= mse;j++)
                {
                    if(A[j] < min)
                        min = A[j];
                }
    
                max_slice -= min;
            }
        }
    
        return max_slice;
    }
    
    0 讨论(0)
提交回复
热议问题