É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).
fichier json
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| = 100Saisir : arr[] = [4 6]
Sortir : 2
Explication: Nous pouvons changer toutes ses valeurs à 5 avec un coût minimum
|4 - 5| + |5 - 6| = 2Saisir: 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)
C++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++ 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 :
- Recherchez les valeurs minimales et maximales dans le tableau pour établir la plage de recherche
- Utilisez la recherche binaire entre les valeurs minimales et maximales pour localiser la valeur cible optimale
- Pour chaque valeur d'essai, calculez le coût total de conversion de tous les éléments du tableau en cette valeur
- 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.
- Continuez à restreindre la plage de recherche jusqu'à trouver la configuration au coût minimum
// 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 :
- Triez le tableau pour traiter les éléments par ordre croissant.
- 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.
- 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)
- Comparez le coût actuel avec le coût minimum.
// 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
100Créer un quiz