Imaginemos un escenario.
Deje que la matriz para la que necesitamos encontrar el producto máximo sea nums
.
nums = [1]
- ¿Qué tipo de algoritmos / pruebas / procedimientos analíticos se utilizan en el comercio minorista y para estudiar el comportamiento del consumidor?
- Sistemas distribuidos: ¿es posible utilizar el algoritmo de Paxos para generar números de secuencia (seqnums)?
- Cómo cifrar un fragmento de texto usando un algoritmo de cifrado
- Cómo resolver la recurrencia t (n) = 2t (n / 2) + n / logn
- ¿Cuál es la diferencia entre el árbol de búsqueda binario y la búsqueda binaria?
¿Cuál es el producto máximo? 1. ¿Cierto?
Ahora, ¿cuál es el producto máximo de nums = [1, -3]
?
La respuesta es 1.
Extendamos esto más allá. Ahora la matriz, nums = [1, -3 -5]
?
15 ahora.
Tengamos nums = [1, -3, -5, -2, 0, 4, 9, 0, 3, -8, 7, -6]
.
Ahora la respuesta es 1008. ¿Cómo llegamos a esto?
Sabemos que si multiplicamos dos números, el producto será grande si los números son grandes en magnitud y son del mismo signo.
- Dos números negativos grandes producen un producto positivo grande
- Dos números positivos grandes producen un producto positivo grande
- Un número positivo grande y un número negativo grande producen un producto negativo grande (que puede usarse o no con otro número negativo para producir un producto positivo grande )
Por lo tanto, para encontrar el producto máximo en una submatriz, tenemos que hacer un seguimiento tanto del producto mínimo local como del producto máximo local.
El mejor de todos los productos máximos locales será nuestra respuesta.
Matemáticamente,
[math] localMax = max (previousLocalMax * currentNumber, currentNumber), if currentNumber> = 0 [/ math]
[math] localMax = max (previousLocalMin * currentNumber, currentNumber), if currentNumber <0 [/ math]
[math] localMin = min (previousLocalMin * currentNumber, currentNumber), if currentNumber> = 0 [/ math]
[math] localMin = max (previousLocalMax * currentNumber, currentNumber), if currentNumber <0 [/ math]
[matemáticas] respuesta = max _ {\ forall x} (localMax) [/ matemáticas]
Programáticamente,
int maxProduct (vector y números) {
int localMax = nums [0];
int localMin = nums [0];
int maxProd = nums [0];
for (int i = 1; i <nums.size (); i ++) {
if (nums [i]> 0) {
localMax = max (localMax * nums [i], nums [i]);
localMin = min (localMin * nums [i], nums [i]);
} más {
int localMaxNeg = max (localMin * nums [i], nums [i]);
localMin = min (localMax * nums [i], nums [i]);
localMax = localMaxNeg;
}
maxProd = max (maxProd, localMax);
}
return maxProd;
}