Diferencia máxima posible entre dos subarreglos después de eliminar N elementos de Array

Dada una array arr[] que tiene un tamaño de 3*N , la tarea es eliminar N elementos y dividir toda la array en dos partes iguales de modo que la diferencia de la suma de la subarreglo izquierda y la subarreción derecha rinda al máximo.

Ejemplos:

Entrada: arr[] = [5, 4, 4, 2, 3, 3]
Salida: 4
Explicación:  Los elementos ‘2’ que se eliminarán son [4, 3]. 
y cuando divide la array en dos partes iguales después de la eliminación
subarreglo izquierdo = [5, 4], subarreglo derecho = [2, 3]. 
La suma de la diferencia entre ellos es (9-5) = 4

Entrada: arr[] = [4, 5, 6, 1, 2, 8, 7, 9, 3]
Salida: 9

Acercarse:

Divida la array en dos subarreglos en algún punto i ( N <= i <= 2 * N ). Eliminamos i – N elementos más pequeños del primer subarreglo y (2 * N – i) elementos más grandes del segundo subarreglo. De esa manera, para una división dada, obtenemos la suma_primero más grande posible y la suma_segundo más pequeña posible.

Usar el montón Max y Min para realizar un seguimiento de los elementos más pequeños y más grandes, respectivamente. Y actualiza la diferencia.

Siga los pasos a continuación para implementar la idea:

  • Inicialice una variable final_diff para almacenar la diferencia máxima entre el subarreglo izquierdo y derecho después de eliminar N elementos.
  • Ejecute un ciclo for de N a 2*N y arr[] en dos mitades izquierda y derecha.
    • Elimine i – N elementos más pequeños de la array izquierda y 2*N – i elementos más grandes de la array derecha utilizando Min y Max heap .
    • Calcule la suma de N valores más grandes en la array izquierda y N valores más pequeños en la array derecha y descubra la diferencia entre ellos y guárdela en la variable Curr_diff .
    • Maximiza el valor de final_diff con curr_diff
  • Devuelve el valor de final_diff.

A continuación se muestra la implementación.

Python3

import copy
import heapq
from collections import Counter
  
  
# This function return the (1, n-1) min and max 
# elements which are t be discarded from the array
def best_remove(left, right):
  
    temp = []
    heapq.heapify(left)
    heapq.heapify(right)
  
    if len(left) == n and len(right) > n:
        # remove all n elements from the right side
        temp.extend(heapq.nlargest(n, right))
    elif len(right) == n and len(left) > n:
        # remove all element from the left side
        temp.extend(heapq.nsmallest(n, left))
    else:
        x = len(left) - n
        temp.extend(heapq.nsmallest(x, left)+heapq.nlargest(n-x, right))
    return temp
  
  
def remove_elements(parent, child):
  
    f_s = Counter(child)
      
    # storing all the elements of right
    # part to preserve the order incase of duplicates
    r_h = []  
  
    for i in parent:
        if i in f_s and f_s[i] > 0:
            f_s[i] -= 1
        else:
            r_h.append(i)
  
    # print("after r", left + r_h)
    return r_h
  
    # Remove the child from parent
    # divide the array
    # sum the left and right elemets
    # track the curr max sum until the for loops terminates
    # return the final max diffrence
    # print(parent, n, child, m)
  
    # print(left, right)
  
  
def max_diff(arr):  # function that calculats the sum of maximum diffrence between two arrays
    # print(arr)
  
    mid = len(arr)//2
  
    left = sum(arr[:mid])
    right = sum(arr[mid:])
    return left-right
  
  
arr = [7, 9, 5, 8, 1, 3]
n = len(arr)//3
  
final_max = -float("inf")
  
# starting from the index 2
for i in range(n, 2 * n + 1):
  
    left = arr[:i]  # dividing the left
    right = arr[i:]  # dividing te right sub array
  
    # print(left, right)
  
    # functions which returns the best elements to be removed from both sub arrays
    best_remove_elements = best_remove(left, right)
    # print(best_remove_elements)
  
    dup = []
    # copying the original array so that the changes might not reflct
    dup = copy.deepcopy(arr)
  
    # function that returns the array after removing the best_remove elements
    remove_element = remove_elements(dup, best_remove_elements)
    # print(remove_element)
    # return(remove_element)
  
    curr_max = max_diff(remove_element)  # tracking the maximum
    final_max = max(final_max, curr_max)
  
print("The maximum diffrence between S1 and S2 is", final_max)
Producción

The maximum diffrence between S1 and S2 is 13

Complejidad de tiempo: (N*log(N))
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por saikumarkudikala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *