Rendre tous les éléments du tableau égaux avec un coût minimum

Étant donné une gamme de tailles n la tâche est de rendre la valeur de tous les éléments égale à coût minimum . Le coût de changement d’une valeur de x à y est abs(x - y).

Exemples :  

Saisir: arr[] = [1 100 101]
Sortir : 100
Explication: Nous pouvons changer toutes ses valeurs à 100 avec un coût minimum
|1 - 100| + |100 - 100| + |101 - 100| = 100

Saisir : arr[] = [4 6]
Sortir : 2
Explication: Nous pouvons changer toutes ses valeurs à 5 avec un coût minimum
|4 - 5| + |5 - 6| = 2

Saisir: arr[] = [5 5 5 5]
Sortir:
Explication: Toutes les valeurs sont déjà égales.

[Approche naïve] Utilisation de 2 boucles imbriquées - temps O(n^2) et espace O(1)

Veuillez noter que notre réponse peut toujours être l'une des valeurs du tableau. Même dans le deuxième exemple ci-dessus, nous pouvons alternativement faire les deux en 4 ou les deux en 6 au même coût.
L'idée est de considérer chaque valeur du tableau comme une valeur cible potentielle, puis de calculer le coût total de conversion de tous les autres éléments vers cette valeur cible. En vérifiant toutes les valeurs cibles possibles, nous pouvons trouver celle qui entraîne le coût global minimum de conversion.

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  ));   

Sortir
100  

[Approche attendue - 1] Utilisation de la recherche binaire - Temps O(n Log (Plage)) et espace O(1)

L'idée est d'utiliser la recherche binaire pour trouver efficacement la valeur optimale à laquelle tous les éléments du tableau doivent être convertis. Étant donné que la fonction de coût total forme une courbe convexe (d'abord décroissante puis croissante) sur la plage de valeurs possibles, nous pouvons utiliser la recherche binaire pour localiser le point minimum de cette courbe en comparant le coût à un point médian avec le coût à un point médian moins un, ce qui nous indique dans quelle direction poursuivre la recherche.

Approche étape par étape :

  1. Recherchez les valeurs minimales et maximales dans le tableau pour établir la plage de recherche
  2. Utilisez la recherche binaire entre les valeurs minimales et maximales pour localiser la valeur cible optimale
  3. Pour chaque valeur d'essai, calculez le coût total de conversion de tous les éléments du tableau en cette valeur
  4. Comparez le coût au point médian actuel avec le coût au point médian moins un pour déterminer la direction de la recherche.
  5. Continuez à restreindre la plage de recherche jusqu'à trouver la configuration au coût minimum
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  ));   

Sortir
100 

[Approche attendue - 2] Utilisation du tri - Temps O(n Log n) et espace O(1)

L'idée est de trouver la valeur optimale à laquelle tous les éléments doivent être égalisés, qui doivent être l'un des éléments du tableau existants. En triant d'abord le tableau, puis en parcourant chaque élément en tant que valeur cible potentielle, nous calculons le coût de transformation de tous les autres éléments en cette valeur en suivant efficacement la somme des éléments à gauche et à droite de la position actuelle.

Approche étape par étape :

  1. Triez le tableau pour traiter les éléments par ordre croissant.
  2. Pour chaque élément, en tant que valeur cible potentielle, calculez deux coûts : faire monter les éléments plus petits et les éléments plus grands vers le bas.
  3. Suivez les sommes gauche et droite pour calculer ces coûts efficacement en temps constant par itération.
    • Augmenter les coûts des éléments plus petits : (valeur actuelle × nombre d'éléments plus petits) - (somme des éléments plus petits)
    • Réduire les coûts des éléments plus grands : (somme des éléments plus grands) - (valeur actuelle × nombre d'éléments plus grands)
  4. Comparez le coût actuel avec le coût minimum.
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  ));   

Sortir
100 
Créer un quiz