Dada una array a, tenemos que encontrar el mínimo producto posible con el subconjunto de elementos presentes en la array. El producto mínimo también puede ser un solo elemento.
Ejemplos:
Input : a[] = { -1, -1, -2, 4, 3 } Output : -24 Explanation : Minimum product will be ( -2 * -1 * -1 * 4 * 3 ) = -24 Input : a[] = { -1, 0 } Output : -1 Explanation : -1(single element) is minimum product possible Input : a[] = { 0, 0, 0 } Output : 0
Una solución simple es generar todos los subconjuntos , encontrar el producto de cada subconjunto y devolver el producto mínimo.
Una mejor solución es usar los siguientes datos.
- Si hay un número par de números negativos y ningún cero, el resultado es el producto de todos excepto el número negativo de mayor valor.
- Si hay un número impar de números negativos y ningún cero, el resultado es simplemente el producto de todos.
- Si hay ceros y positivo, no negativo, el resultado es 0. El caso excepcional es cuando no hay un número negativo y todos los demás elementos positivos, entonces nuestro resultado debe ser el primer número positivo mínimo.
C++
// CPP program to find maximum product of // a subset. #include <bits/stdc++.h> using namespace std; int minProductSubset(int a[], int n) { if (n == 1) return a[0]; // Find count of negative numbers, count // of zeros, maximum valued negative number, // minimum valued positive number and product // of non-zero numbers int max_neg = INT_MIN; int min_pos = INT_MAX; int count_neg = 0, count_zero = 0; int prod = 1; for (int i = 0; i < n; i++) { // If number is 0, we don't // multiply it with product. if (a[i] == 0) { count_zero++; continue; } // Count negatives and keep // track of maximum valued negative. if (a[i] < 0) { count_neg++; max_neg = max(max_neg, a[i]); } // Track minimum positive // number of array if (a[i] > 0) min_pos = min(min_pos, a[i]); prod = prod * a[i]; } // If there are all zeros // or no negative number present if (count_zero == n || (count_neg == 0 && count_zero > 0)) return 0; // If there are all positive if (count_neg == 0) return min_pos; // If there are even number of // negative numbers and count_neg not 0 if (!(count_neg & 1) && count_neg != 0) { // Otherwise result is product of // all non-zeros divided by maximum // valued negative. prod = prod / max_neg; } return prod; } int main() { int a[] = { -1, -1, -2, 4, 3 }; int n = sizeof(a) / sizeof(a[0]); cout << minProductSubset(a, n); return 0; }
Producción:
-24
Tiempo Complejidad : O(n)
Espacio Auxiliar : O(1)
Consulte el artículo completo sobre el subconjunto mínimo de productos de una array para obtener más detalles.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA