Categorías
Algorithms

LeetCode – Mejor momento para comprar y vender acciones III (Java)

Supongamos que tiene una matriz para la que el i-ésimo elemento es el precio de una acción determinada el día i.

Diseñe un algoritmo para encontrar el máximo beneficio. Puede completar como máximo dos transacciones.

Nota:
Una transacción es una compra y una venta. No puede realizar varias transacciones al mismo tiempo (es decir, debe vender las acciones antes de volver a comprar).

Análisis

En comparación con I y II, III limita el número de transacciones a 2. Esto se puede resolver «dividir y conquistar». Usamos izquierda[i] para rastrear el beneficio máximo de las transacciones antes de i, y usar el derecho[i] para rastrear el beneficio máximo para transacciones después de i. Puede utilizar el siguiente ejemplo para comprender la solución de Java:

Prices: 1 4 5 7 6 3 2 9
left = [0, 3, 4, 6, 6, 6, 6, 8]
right= [8, 7, 7, 7, 7, 7, 7, 0]

El beneficio máximo = 13

Solución Java

public int maxProfit(int[] prices) {
	if (prices == null || prices.length < 2) {
		return 0;
	}
 
	//highest profit in 0 ... i
	int[] left = new int[prices.length];
	int[] right = new int[prices.length];
 
	// DP from left to right
	left[0] = 0; 
	int min = prices[0];
	for (int i = 1; i < prices.length; i++) {
		min = Math.min(min, prices[i]);
		left[i] = Math.max(left[i - 1], prices[i] - min);
	}
 
	// DP from right to left
	right[prices.length - 1] = 0;
	int max = prices[prices.length - 1];
	for (int i = prices.length - 2; i >= 0; i--) {
		max = Math.max(max, prices[i]);
		right[i] = Math.max(right[i + 1], max - prices[i]);
	}
 
	int profit = 0;
	for (int i = 0; i < prices.length; i++) {
		profit = Math.max(profit, left[i] + right[i]);
	}
 
	return profit;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *