Categorías
Algorithms

LeetCode – Subarreglo máximo (Java)

Encuentre el subarreglo contiguo dentro de un arreglo (que contenga al menos un número) que tenga la suma más grande.

Por ejemplo, dada la matriz [−2,1,−3,4,−1,2,1,−5,4], el subarreglo contiguo [4,−1,2,1] tiene la mayor suma = 6.

Solución de Java – DP

La forma más sencilla de formular la solución de este problema es mediante DP. Sea f (n) el subarreglo máximo para un arreglo con n elementos. Necesitamos encontrar el subproblema y la relación.

f(n) = { f(n-1)>0 ? f(n-1) : 0 } + nums[n-1]

f(0) = 0
f(1) = nums[0]

La condición para cambiar la programación dinámica es «que debemos ignorar la suma de los n-1 elementos anteriores si enésimo elemento es mayor que la suma».

public int maxSubArray(int[] nums) {
    int result = nums[0];
    int[] sum =  new int[nums.length];
    sum[0] = nums[0];
 
    for(int i=1; i<nums.length; i++){
        sum[i] = Math.max(nums[i], sum[i-1] + nums[i]);
        result = Math.max(result, sum[i]);
    }
 
    return result;
}

La complejidad del tiempo y la complejidad del espacio son las mismas O (n). Sin embargo, podemos mejorar la complejidad del espacio y convertirlo en O (1).

public int maxSubArray(int[] nums) {
    int result = nums[0];
    int sum = nums[0];
 
    for(int i=1; i<nums.length; i++){
        sum = Math.max(nums[i], sum + nums[i]);
        result = Math.max(result, sum);
    }
 
    return result;
}
  LeetCode: la ruta de crecimiento más larga en una matriz (Java)

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 *