Categorías
Algorithms Interview

LeetCode – Ladrón de casas II (Java)

Después de robar esas casas en esa calle, el ladrón se ha encontrado un nuevo lugar para su robo para que no reciba demasiada atención. Esta vez, todas las casas de este lugar están dispuestas en círculo. Eso significa que la primera casa es vecina de la última. Mientras tanto, el sistema de seguridad de estas casas sigue siendo el mismo que el de la calle anterior.

Dada una lista de números enteros no negativos que representan la cantidad de dinero de cada casa, determina la cantidad máxima de dinero que puedes robar esta noche sin alertar a la policía.

Análisis

Esta es una extensión de House Robber. Aquí hay dos casos 1) El primer elemento está incluido y el último no está incluido 2) El primero no está incluido y el último está incluido. Por lo tanto, podemos usar el enfoque de programación dinámica similar para escanear la matriz dos veces y obtener el valor mayor.

Solución Java

public int rob(int[] nums) {
    if(nums==null || nums.length==0)
        return 0; 
 
    if(nums.length==1)
        return nums[0];
 
    int max1 = robHelper(nums, 0, nums.length-2);
    int max2 = robHelper(nums, 1, nums.length-1);
 
    return Math.max(max1, max2);
}
 
public int robHelper(int[] nums, int i, int j){
    if(i==j){
        return nums[i];
    }
 
    int[] dp = new int[nums.length];
    dp[i]=nums[i];
    dp[i+1]=Math.max(nums[i+1], dp[i]);
 
    for(int k=i+2; k<=j; k++){
        dp[k]=Math.max(dp[k-1], dp[k-2]+nums[k]);    
    }
 
    return dp[j];
}
  LeetCode - Fracción a decimal recurrente (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 *