find the subarray where the square of the difference of the elements at even and odd places in that subarray is maximal

Viewed 14

Somewhere on HackerRank I saw a problem: find the subarray where the square of the difference of the elements at even and odd places in that subarray is maximal.

Now I can't find this problem there.

The Force method requires about n**3/6 = O(n**3) operations. The method based on DP ideas is about n**2/2 = O(n**2). The code below. I'm currently trying to think of something more efficient based on the divide-and-conquer approach, but I can't complete the algorithm. My existing code seems to me to be erroneous.

May be someone can tell me where to dig further or give me a useful link? Or maybe this problem has already been discussed? Unfortunately I can't find anything suitable.

Thanks.

'''
find subarray with max (sum(odd) - sum(even))**2
'''
#-------------------------------------------------------------------------------
def maxsum(arr): #O(n^3 / 6)
    iter=0
    n= len(arr)
    mx = 0
    for start in range(n):
        d = arr[start]
        d*=d
        if d > mx: mx=d
        for leni in range(1,n-start):
            sub = arr[start:start+leni+1]
            ns = len(sub)
            sum0, sum1 = 0, 0
            for i in range(ns):
                if i %2 ==0: sum0+=sub[i]
                else: sum1 += sub[i]
                iter+=1
            tmp = sum0-sum1
            tmp*=tmp
            if tmp > mx: mx = tmp
    return mx,iter
#-------------------------------------------------------------------------------
def maxsum1(arr): #O(n^2 / 2)
    iter=0
    n= len(arr)
    mx = 0
    for start in range(n):
        d = arr[start]
        d*=d
        if d > mx: mx=d
        sum0, sum1 = 0, 0
        for leni in range(n-start):
            i = start+leni
            c = arr[i]
            if i %2 ==0: sum0 += c
            else: sum1 += c
            iter+=1
            tmp = sum0-sum1
            tmp*=tmp
            if tmp > mx: mx = tmp
    return mx,iter
#-------------------------------------------------------------------------------
iter=0
def maxx(arr):
    global iter
    n= len(arr)
    sum0, sum1 = 0, 0
    for i in range(n):
        c = arr[i]
        if i%2==0: sum0 += c
        else: sum1 += c
        iter+=1
    d = sum0-sum1
    d*=d
    return d


def maxsum2(arr): #O(1.4*n*ln n + 2*n)
    global iter
    n= len(arr)
    mx = 0
    if n==1:
        iter+=1
        return arr[0]*arr[0]
    if n==2:
        d0 = arr[0]*arr[0]
        d1 = arr[1]*arr[1]
        d2 = arr[0] - arr[1]
        d2*=d2
        iter+=6
        return max(d0,d1,d2)
    d0 = maxsum2(arr[:n//2])
    d1 = maxsum2(arr[n//2:])
    d2 = maxx(arr)
    res = max(d0,d1)
    res = max(res,d2)
    return res
#-------------------------------------------------------------------------------
def main():
    arr = [1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5,1,-2,3,-4,5]
    print(len(arr))
    print(maxsum(arr))
    print(maxsum1(arr))
    print(maxsum2(arr),iter)
0 Answers
Related