Requisito previo: Mediana de ventana deslizante
Dado un arreglo arr[] que consta de N enteros y un entero K , la tarea es encontrar el costo mínimo requerido para hacer que cada elemento de cada subarreglo de longitud K sea igual. El costo de reemplazar cualquier elemento de la array por otro elemento es la diferencia absoluta entre los dos.
Ejemplos:
Entrada: A[] = {1, 2, 3, 4, 6}, K = 3
Salida: 7
Explicación:
Subarreglo 1: Costo de convertir el subarreglo {1, 2, 3} a {2, 2, 2} = | 1-2| + |2-2| + |3-2| = 2
Subarreglo 2: Costo de convertir el subarreglo {2, 3, 4} a {3, 3, 3} = |2-3| + |3-3| + |4-3| = 2
Subarreglo 3: Costo de convertir el subarreglo {3, 4, 6} a {4, 4, 4} = |3-4| + |4-4| + |6-4| = 3
Costo mínimo = 2 + 2 + 3 = 7/
Entrada: A[] = {2, 3, 4, 4, 1, 7, 6}, K = 4
Salida: 21
Enfoque:
para encontrar el costo mínimo para convertir cada elemento del subarreglo en un solo elemento, cambie cada elemento del subarreglo a la mediana de ese subarreglo . Siga los pasos a continuación para resolver el problema:
- Para encontrar la mediana para cada subarreglo en ejecución de manera eficiente, use un conjunto múltiple para obtener el orden ordenado de los elementos en cada subarreglo. La mediana será el elemento central de este conjunto múltiple .
- Para el siguiente subarreglo, elimine el elemento más a la izquierda del subarreglo anterior del conjunto múltiple, agregue el elemento actual al conjunto múltiple.
- Mantenga un puntero en el medio para realizar un seguimiento eficiente del elemento medio del conjunto múltiple.
- Si el elemento recién agregado es más pequeño que el elemento intermedio anterior , mueva mid a su elemento más pequeño inmediato. De lo contrario, mueva mid a su siguiente elemento inmediato.
- Calcule el costo de reemplazar cada elemento del subarreglo por la ecuación | A[i] – mediana de cada_subarreglo | .
- Finalmente imprima el costo total.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to find the minimum // cost to convert each element of // every subarray of size K equal int minimumCost(vector<int> arr, int n, int k) { // Stores the minimum cost int totalcost = 0; int i, j; // Stores the first K elements multiset<int> mp(arr.begin(), arr.begin() + k); if (k == n) { // Obtain the middle element of // the multiset auto mid = next(mp.begin(), n / 2 - ((k + 1) % 2)); int z = *mid; // Calculate cost for the subarray for (i = 0; i < n; i++) totalcost += abs(z - arr[i]); // Return the total cost return totalcost; } else { // Obtain the middle element // in multiset auto mid = next(mp.begin(), k / 2 - ((k + 1) % 2)); for (i = k; i < n; i++) { int zz = *mid; int cost = 0; for (j = i - k; j < i; j++) { // Cost for the previous // k length subarray cost += abs(arr[j] - zz); } totalcost += cost; // Insert current element // into multiset mp.insert(arr[i]); if (arr[i] < *mid) { // New element appears // to the left of mid mid--; } if (arr[i - k] <= *mid) { // New element appears // to the right of mid mid++; } // Remove leftmost element // from the window mp.erase(mp.lower_bound(arr[i - k])); // For last element if (i == n - 1) { zz = *mid; cost = 0; for (j = i - k + 1; j <= i; j++) { // Calculate cost for the subarray cost += abs(zz - arr[j]); } totalcost += cost; } } // Return the total cost return totalcost; } } // Driver Code int main() { int N = 5, K = 3; vector<int> A({ 1, 2, 3, 4, 6 }); cout << minimumCost(A, N, K); }
7
Complejidad temporal: O(NlogN)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por Ripunjoy Medhi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA