Med tanke på en mängd storlekar n uppgiften är att göra värdet av alla element lika med lägsta kostnad . Kostnaden för att ändra ett värde från x till y är abs(x - y).
Exempel:
Input: arr[] = [1 100 101]
Produktion : 100
Förklaring: Vi kan ändra alla dess värden till 100 med lägsta kostnad
|1 - 100| + |100 - 100| + |101 - 100| = 100Input : arr[] = [4 6]
Produktion : 2
Förklaring: Vi kan ändra alla dess värden till 5 med lägsta kostnad
|4 - 5| + |5 - 6| = 2Input: arr[] = [5 5 5 5]
Produktion:
Förklaring: Alla värden är redan lika.
[Naiv tillvägagångssätt] med två kapslade loopar - O(n^2) tid och O(1) utrymme
C++Observera att vårt svar alltid kan vara ett av arrayvärdena. Även i det andra exemplet ovan kan vi alternativt göra båda som 4 eller båda som 6 till samma kostnad..
Tanken är att betrakta varje värde i arrayen som ett potentiellt målvärde och sedan beräkna den totala kostnaden för att konvertera alla andra element till det målvärdet. Genom att kontrollera alla möjliga målvärden kan vi hitta det som resulterar i den lägsta totala konverteringskostnaden.
// 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));
Produktion
100
[Förväntad tillvägagångssätt - 1] Använda binär sökning - O(n Log (intervall)) tid och O(1) utrymme
Tanken är att använda binär sökning för att effektivt hitta det optimala värdet som alla arrayelement ska konverteras till. Eftersom totalkostnadsfunktionen bildar en konvex kurva (först avtagande och sedan ökande) över intervallet av möjliga värden kan vi använda binär sökning för att lokalisera minimipunkten för denna kurva genom att jämföra kostnaden vid en mittpunkt med kostnaden vid mittpunkten minus en som talar om för oss i vilken riktning vi ska söka vidare.
Steg för steg tillvägagångssätt:
- Hitta lägsta och högsta värden i arrayen för att fastställa sökintervallet
- Använd binär sökning mellan lägsta och högsta värden för att hitta det optimala målvärdet
- För varje testvärde beräkna den totala kostnaden för att konvertera alla arrayelement till det värdet
- Jämför kostnaden vid nuvarande mittpunkt med kostnad vid mittpunkten minus ett för att bestämma sökriktningen
- Fortsätt att begränsa sökintervallet tills du hittar den lägsta kostnadskonfigurationen
// 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));
Produktion
100
[Förväntad tillvägagångssätt - 2] Använda sortering - O(n Log n) tid och O(1) utrymme
Tanken är att hitta det optimala värdet till vilket alla element ska utjämnas, vilket måste vara ett av de befintliga arrayelementen. Genom att först sortera arrayen och sedan iterera genom varje element som ett potentiellt målvärde beräknar vi kostnaden för att transformera alla andra element till det värdet genom att effektivt spåra summan av element till vänster och höger om den aktuella positionen.
Steg för steg tillvägagångssätt:
- Sortera arrayen för att bearbeta element i stigande ordning.
- Beräkna två kostnader för varje element som potentiellt målvärde: att få upp mindre element och större element ner.
- Spåra vänster- och högersummor för att effektivt beräkna dessa kostnader i konstant tid per iteration.
- Att höja kostnaderna för mindre element: (aktuellt värde × antal mindre element) - (summan av mindre element)
- Att sänka kostnaderna för större element: (summan av större element) - (aktuellt värde × antal större element)
- Jämför nuvarande kostnad med lägsta kostnad.
// 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));
Produktion
100Skapa frågesport