Haga que todos los elementos de la matriz sean iguales con un costo mínimo

Dada una matriz de tamaño norte la tarea es hacer que el valor de todos los elementos sea igual a costo minimo . El costo de cambiar un valor de x a y es abs(x - y).

Ejemplos:  

Aporte: llegada[] = [1 100 101]
Producción : 100
Explicación: Podemos cambiar todos sus valores a 100 con coste mínimo.
|1 - 100| + |100 - 100| + |101 - 100| = 100

Aporte : arreglo[] = [4 6]
Producción : 2
Explicación: Podemos cambiar todos sus valores a 5 con coste mínimo.
|4 - 5| + |5 - 6| = 2

Aporte: arreglo[] = [5 5 5 5]
Producción:
Explicación: Todos los valores ya son iguales.

[Enfoque ingenuo] Uso de 2 bucles anidados: tiempo O(n^2) y espacio O(1)

Tenga en cuenta que nuestra respuesta siempre puede ser uno de los valores de la matriz. Incluso en el segundo ejemplo anterior, alternativamente podemos hacer que ambos sean 4 o ambos como 6 al mismo costo.
La idea es considerar cada valor de la matriz como un valor objetivo potencial y luego calcular el costo total de convertir todos los demás elementos a ese valor objetivo. Al verificar todos los valores objetivo posibles, podemos encontrar el que resulte en el costo total mínimo de conversión.

C++
   // C++ program to Make all array    // elements equal with minimum cost   #include          using     namespace     std  ;   // Function which finds the minimum    // cost to make array elements equal   int     minCost  (  vector   <  int  >     &  arr  )     {      int     n     =     arr  .  size  ();      int     ans     =     INT_MAX  ;          // Try each element as the target value      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      int     currentCost     =     0  ;          // Calculate cost of making all       // elements equal to arr[i]      for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {      currentCost     +=     abs  (  arr  [  j  ]     -     arr  [  i  ]);      }          // Update minimum cost if current cost is lower      ans     =     min  (  ans       currentCost  );      }          return     ans  ;   }   int     main  ()     {      vector   <  int  >     arr     =     {  1       100       101  };      cout      < <     minCost  (  arr  )      < <     endl  ;          return     0  ;   }   
Java
   // Java program to Make all array    // elements equal with minimum cost   import     java.util.*  ;   class   GfG     {      // Function which finds the minimum       // cost to make array elements equal      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  length  ;      int     ans     =     Integer  .  MAX_VALUE  ;      // Try each element as the target value      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      int     currentCost     =     0  ;      // Calculate cost of making all       // elements equal to arr[i]      for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {      currentCost     +=     Math  .  abs  (  arr  [  j  ]     -     arr  [  i  ]  );      }      // Update minimum cost if current cost is lower      ans     =     Math  .  min  (  ans       currentCost  );      }      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  1       100       101  };      System  .  out  .  println  (  minCost  (  arr  ));      }   }   
Python
   # Python program to Make all array    # elements equal with minimum cost   # Function which finds the minimum    # cost to make array elements equal   def   minCost  (  arr  ):   n   =   len  (  arr  )   ans   =   float  (  'inf'  )   # Try each element as the target value   for   i   in   range  (  n  ):   currentCost   =   0   # Calculate cost of making all    # elements equal to arr[i]   for   j   in   range  (  n  ):   currentCost   +=   abs  (  arr  [  j  ]   -   arr  [  i  ])   # Update minimum cost if current cost is lower   ans   =   min  (  ans     currentCost  )   return   ans   if   __name__   ==   '__main__'  :   arr   =   [  1     100     101  ]   print  (  minCost  (  arr  ))   
C#
   // C# program to Make all array    // elements equal with minimum cost   using     System  ;   class     GfG     {      // Function which finds the minimum       // cost to make array elements equal      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  Length  ;      int     ans     =     int  .  MaxValue  ;      // Try each element as the target value      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      int     currentCost     =     0  ;      // Calculate cost of making all       // elements equal to arr[i]      for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {      currentCost     +=     Math  .  Abs  (  arr  [  j  ]     -     arr  [  i  ]);      }      // Update minimum cost if current cost is lower      ans     =     Math  .  Min  (  ans       currentCost  );      }      return     ans  ;      }      static     void     Main  ()     {      int  []     arr     =     {  1       100       101  };      Console  .  WriteLine  (  minCost  (  arr  ));      }   }   
JavaScript
   // JavaScript program to Make all array    // elements equal with minimum cost   // Function which finds the minimum    // cost to make array elements equal   function     minCost  (  arr  )     {      let     n     =     arr  .  length  ;      let     ans     =     Number  .  MAX_SAFE_INTEGER  ;      // Try each element as the target value      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      let     currentCost     =     0  ;      // Calculate cost of making all       // elements equal to arr[i]      for     (  let     j     =     0  ;     j      <     n  ;     j  ++  )     {      currentCost     +=     Math  .  abs  (  arr  [  j  ]     -     arr  [  i  ]);      }      // Update minimum cost if current cost is lower      ans     =     Math  .  min  (  ans       currentCost  );      }      return     ans  ;   }   let     arr     =     [  1       100       101  ];   console  .  log  (  minCost  (  arr  ));   

Producción
100  

[Enfoque esperado - 1] Uso de la búsqueda binaria - O(n Log (Rango)) tiempo y O(1) espacio

La idea es utilizar la búsqueda binaria para encontrar de manera eficiente el valor óptimo al que se deben convertir todos los elementos de la matriz. Dado que la función de costo total forma una curva convexa (primero decreciente y luego creciente) en todo el rango de valores posibles, podemos usar la búsqueda binaria para ubicar el punto mínimo de esta curva comparando el costo en el punto medio con el costo en el punto medio menos uno, lo que nos indica en qué dirección buscar más.

Enfoque paso a paso:

  1. Encuentre los valores mínimo y máximo en la matriz para establecer el rango de búsqueda
  2. Utilice la búsqueda binaria entre los valores mínimo y máximo para localizar el valor objetivo óptimo
  3. Para cada valor de prueba, calcule el costo total de convertir todos los elementos de la matriz a ese valor.
  4. Compare el costo en el punto medio actual con el costo en el punto medio menos uno para determinar la dirección de búsqueda
  5. Continuar acotando el rango de búsqueda hasta encontrar la configuración de mínimo coste
C++
   // C++ program to Make all array    // elements equal with minimum cost   #include          using     namespace     std  ;   // Function to find the cost of changing   // array values to mid.   int     findCost  (  vector   <  int  >     &  arr       int     mid  )     {      int     n     =     arr  .  size  ();      int     ans     =     0  ;      for     (  int     i  =  0  ;     i   <  n  ;     i  ++  )     {      ans     +=     abs  (  arr  [  i  ]     -     mid  );      }      return     ans  ;   }   // Function which finds the minimum cost    // to make array elements equal.   int     minCost  (  vector   <  int  >     &  arr  )     {      int     n     =     arr  .  size  ();      int     mini     =     INT_MAX       maxi     =     INT_MIN  ;          // Find the minimum and maximum value.      for     (  int     i  =  0  ;     i   <  n  ;     i  ++  )     {      mini     =     min  (  mini       arr  [  i  ]);      maxi     =     max  (  maxi       arr  [  i  ]);      }          int     s     =     mini       e     =     maxi  ;      int     ans     =     INT_MAX  ;          while     (  s      <=     e  )     {      int     mid     =     s     +     (  e  -  s  )  /  2  ;          int     cost1     =     findCost  (  arr       mid  );      int     cost2     =     findCost  (  arr       mid  -1  );          if     (  cost1      <     cost2  )     {      ans     =     cost1  ;      s     =     mid     +     1  ;      }      else     {      e     =     mid     -     1  ;      }      }          return     ans  ;   }   int     main  ()     {      vector   <  int  >     arr     =     {  1       100       101  };      cout      < <     minCost  (  arr  );          return     0  ;   }   
Java
   // Java program to Make all array    // elements equal with minimum cost   import     java.util.*  ;   class   GfG     {      // Function to find the cost of changing      // array values to mid.      static     int     findCost  (  int  []     arr       int     mid  )     {      int     n     =     arr  .  length  ;      int     ans     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      ans     +=     Math  .  abs  (  arr  [  i  ]     -     mid  );      }      return     ans  ;      }      // Function which finds the minimum cost       // to make array elements equal.      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  length  ;      int     mini     =     Integer  .  MAX_VALUE       maxi     =     Integer  .  MIN_VALUE  ;      // Find the minimum and maximum value.      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      mini     =     Math  .  min  (  mini       arr  [  i  ]  );      maxi     =     Math  .  max  (  maxi       arr  [  i  ]  );      }      int     s     =     mini       e     =     maxi  ;      int     ans     =     Integer  .  MAX_VALUE  ;      while     (  s      <=     e  )     {      int     mid     =     s     +     (  e     -     s  )     /     2  ;      int     cost1     =     findCost  (  arr       mid  );      int     cost2     =     findCost  (  arr       mid     -     1  );      if     (  cost1      <     cost2  )     {      ans     =     cost1  ;      s     =     mid     +     1  ;      }     else     {      e     =     mid     -     1  ;      }      }      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  1       100       101  };      System  .  out  .  println  (  minCost  (  arr  ));      }   }   
Python
   # Python program to Make all array    # elements equal with minimum cost   # Function to find the cost of changing   # array values to mid.   def   findCost  (  arr     mid  ):   n   =   len  (  arr  )   ans   =   0   for   i   in   range  (  n  ):   ans   +=   abs  (  arr  [  i  ]   -   mid  )   return   ans   # Function which finds the minimum cost    # to make array elements equal.   def   minCost  (  arr  ):   n   =   len  (  arr  )   mini   =   float  (  'inf'  )   maxi   =   float  (  '-inf'  )   # Find the minimum and maximum value.   for   i   in   range  (  n  ):   mini   =   min  (  mini     arr  [  i  ])   maxi   =   max  (  maxi     arr  [  i  ])   s   =   mini   e   =   maxi   ans   =   float  (  'inf'  )   while   s    <=   e  :   mid   =   s   +   (  e   -   s  )   //   2   cost1   =   findCost  (  arr     mid  )   cost2   =   findCost  (  arr     mid   -   1  )   if   cost1    <   cost2  :   ans   =   cost1   s   =   mid   +   1   else  :   e   =   mid   -   1   return   ans   if   __name__   ==   '__main__'  :   arr   =   [  1     100     101  ]   print  (  minCost  (  arr  ))   
C#
   // C# program to Make all array    // elements equal with minimum cost   using     System  ;   class     GfG     {      // Function to find the cost of changing      // array values to mid.      static     int     findCost  (  int  []     arr       int     mid  )     {      int     n     =     arr  .  Length  ;      int     ans     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      ans     +=     Math  .  Abs  (  arr  [  i  ]     -     mid  );      }      return     ans  ;      }      // Function which finds the minimum cost       // to make array elements equal.      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  Length  ;      int     mini     =     int  .  MaxValue       maxi     =     int  .  MinValue  ;      // Find the minimum and maximum value.      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      mini     =     Math  .  Min  (  mini       arr  [  i  ]);      maxi     =     Math  .  Max  (  maxi       arr  [  i  ]);      }      int     s     =     mini       e     =     maxi  ;      int     ans     =     int  .  MaxValue  ;      while     (  s      <=     e  )     {      int     mid     =     s     +     (  e     -     s  )     /     2  ;      int     cost1     =     findCost  (  arr       mid  );      int     cost2     =     findCost  (  arr       mid     -     1  );      if     (  cost1      <     cost2  )     {      ans     =     cost1  ;      s     =     mid     +     1  ;      }     else     {      e     =     mid     -     1  ;      }      }      return     ans  ;      }      static     void     Main  ()     {      int  []     arr     =     {  1       100       101  };      Console  .  WriteLine  (  minCost  (  arr  ));      }   }   
JavaScript
   // JavaScript program to Make all array    // elements equal with minimum cost   // Function to find the cost of changing   // array values to mid.   function     findCost  (  arr       mid  )     {      let     n     =     arr  .  length  ;      let     ans     =     0  ;      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      ans     +=     Math  .  abs  (  arr  [  i  ]     -     mid  );      }      return     ans  ;   }   // Function which finds the minimum cost    // to make array elements equal.   function     minCost  (  arr  )     {      let     n     =     arr  .  length  ;      let     mini     =     Number  .  MAX_SAFE_INTEGER       maxi     =     Number  .  MIN_SAFE_INTEGER  ;      // Find the minimum and maximum value.      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      mini     =     Math  .  min  (  mini       arr  [  i  ]);      maxi     =     Math  .  max  (  maxi       arr  [  i  ]);      }      let     s     =     mini       e     =     maxi  ;      let     ans     =     Number  .  MAX_SAFE_INTEGER  ;      while     (  s      <=     e  )     {      let     mid     =     Math  .  floor  (  s     +     (  e     -     s  )     /     2  );      let     cost1     =     findCost  (  arr       mid  );      let     cost2     =     findCost  (  arr       mid     -     1  );      if     (  cost1      <     cost2  )     {      ans     =     cost1  ;      s     =     mid     +     1  ;      }     else     {      e     =     mid     -     1  ;      }      }      return     ans  ;   }   let     arr     =     [  1       100       101  ];   console  .  log  (  minCost  (  arr  ));   

Producción
100 

[Enfoque esperado - 2] Uso de la clasificación - O(n Log n) tiempo y O(1) espacio

La idea es encontrar el valor óptimo al que se deben igualar todos los elementos, que debe ser uno de los elementos de la matriz existente. Al ordenar la matriz primero y luego iterar a través de cada elemento como un valor objetivo potencial, calculamos el costo de transformar todos los demás elementos a ese valor al rastrear eficientemente la suma de elementos a la izquierda y a la derecha de la posición actual.

Enfoque paso a paso:

  1. Ordene la matriz para procesar elementos en orden ascendente.
  2. Para cada elemento como valor objetivo potencial, calcule dos costos: subir los elementos más pequeños y bajar los elementos más grandes.
  3. Realice un seguimiento de las sumas izquierda y derecha para calcular estos costos de manera eficiente en un tiempo constante por iteración.
    • Aumentar los costos de elementos más pequeños: (valor actual × número de elementos más pequeños) - (suma de elementos más pequeños)
    • Reducir los costos de los elementos más grandes: (suma de los elementos más grandes) - (valor actual × número de elementos más grandes)
  4. Compare el costo actual con el costo mínimo.
C++
   // C++ program to Make all array    // elements equal with minimum cost   #include          using     namespace     std  ;   // Function which finds the minimum cost    // to make array elements equal.   int     minCost  (  vector   <  int  >     &  arr  )     {      int     n     =     arr  .  size  ();      // Sort the array      sort  (  arr  .  begin  ()     arr  .  end  ());          // Variable to store sum of elements      // to the right side.      int     right     =     0  ;      for     (  int     i  =  0  ;     i   <  n  ;     i  ++  )     {      right     +=     arr  [  i  ];      }          int     ans     =     INT_MAX  ;      int     left     =     0  ;          for     (  int     i  =  0  ;     i   <  n  ;     i  ++  )     {          // Remove the current element from right sum.      right     -=     arr  [  i  ];          // Find cost of incrementing left side elements      int     leftCost     =     i     *     arr  [  i  ]     -     left  ;          // Find cost of decrementing right side elements.      int     rightCost     =     right     -     (  n  -1  -  i  )     *     arr  [  i  ];          ans     =     min  (  ans       leftCost     +     rightCost  );          // Add current value to left sum       left     +=     arr  [  i  ];      }          return     ans  ;   }   int     main  ()     {      vector   <  int  >     arr     =     {  1       100       101  };      cout      < <     minCost  (  arr  );          return     0  ;   }   
Java
   // Java program to Make all array    // elements equal with minimum cost   import     java.util.*  ;   class   GfG     {      // Function which finds the minimum cost       // to make array elements equal.      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  length  ;      // Sort the array      Arrays  .  sort  (  arr  );          // Variable to store sum of elements      // to the right side.      int     right     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      right     +=     arr  [  i  ]  ;      }      int     ans     =     Integer  .  MAX_VALUE  ;      int     left     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // Remove the current element from right sum.      right     -=     arr  [  i  ]  ;      // Find cost of incrementing left side elements      int     leftCost     =     i     *     arr  [  i  ]     -     left  ;      // Find cost of decrementing right side elements.      int     rightCost     =     right     -     (  n     -     1     -     i  )     *     arr  [  i  ]  ;      ans     =     Math  .  min  (  ans       leftCost     +     rightCost  );      // Add current value to left sum       left     +=     arr  [  i  ]  ;      }      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      int  []     arr     =     {  1       100       101  };      System  .  out  .  println  (  minCost  (  arr  ));      }   }   
Python
   # Python program to Make all array    # elements equal with minimum cost   # Function which finds the minimum cost    # to make array elements equal.   def   minCost  (  arr  ):   n   =   len  (  arr  )   # Sort the array   arr  .  sort  ()   # Variable to store sum of elements   # to the right side.   right   =   sum  (  arr  )   ans   =   float  (  'inf'  )   left   =   0   for   i   in   range  (  n  ):   # Remove the current element from right sum.   right   -=   arr  [  i  ]   # Find cost of incrementing left side elements   leftCost   =   i   *   arr  [  i  ]   -   left   # Find cost of decrementing right side elements.   rightCost   =   right   -   (  n   -   1   -   i  )   *   arr  [  i  ]   ans   =   min  (  ans     leftCost   +   rightCost  )   # Add current value to left sum    left   +=   arr  [  i  ]   return   ans   if   __name__   ==   '__main__'  :   arr   =   [  1     100     101  ]   print  (  minCost  (  arr  ))   
C#
   // C# program to Make all array    // elements equal with minimum cost   using     System  ;   class     GfG     {      // Function which finds the minimum cost       // to make array elements equal.      static     int     minCost  (  int  []     arr  )     {      int     n     =     arr  .  Length  ;      // Sort the array      Array  .  Sort  (  arr  );      // Variable to store sum of elements      // to the right side.      int     right     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      right     +=     arr  [  i  ];      }      int     ans     =     int  .  MaxValue  ;      int     left     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // Remove the current element from right sum.      right     -=     arr  [  i  ];      // Find cost of incrementing left side elements      int     leftCost     =     i     *     arr  [  i  ]     -     left  ;      // Find cost of decrementing right side elements.      int     rightCost     =     right     -     (  n     -     1     -     i  )     *     arr  [  i  ];      ans     =     Math  .  Min  (  ans       leftCost     +     rightCost  );      // Add current value to left sum       left     +=     arr  [  i  ];      }      return     ans  ;      }      static     void     Main  ()     {      int  []     arr     =     {  1       100       101  };      Console  .  WriteLine  (  minCost  (  arr  ));      }   }   
JavaScript
   // JavaScript program to Make all array    // elements equal with minimum cost   // Function which finds the minimum cost    // to make array elements equal.   function     minCost  (  arr  )     {      let     n     =     arr  .  length  ;      // Sort the array      arr  .  sort  ((  a       b  )     =>     a     -     b  );      // Variable to store sum of elements      // to the right side.      let     right     =     0  ;      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      right     +=     arr  [  i  ];      }      let     ans     =     Number  .  MAX_SAFE_INTEGER  ;      let     left     =     0  ;      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      // Remove the current element from right sum.      right     -=     arr  [  i  ];      // Find cost of incrementing left side elements      let     leftCost     =     i     *     arr  [  i  ]     -     left  ;      // Find cost of decrementing right side elements.      let     rightCost     =     right     -     (  n     -     1     -     i  )     *     arr  [  i  ];      ans     =     Math  .  min  (  ans       leftCost     +     rightCost  );      // Add current value to left sum       left     +=     arr  [  i  ];      }      return     ans  ;   }   let     arr     =     [  1       100       101  ];   console  .  log  (  minCost  (  arr  ));   

Producción
100 
Crear cuestionario