Categorías
Algorithms Interview

LeetCode – Encuentra el mínimo en la matriz ordenada rotada II (Java)

Seguimiento de «Encontrar mínimo en matriz ordenada rotada»: ¿Qué sucede si se permiten duplicados?

¿Afectaría esto la complejidad del tiempo de ejecución? ¿Como y por qué?

Solución Java 1: recursividad

Este es un problema de seguimiento de encontrar un elemento mínimo en una matriz ordenada rotada sin elementos duplicados. Solo necesitamos agregar una condición más, que verifica si el elemento más a la izquierda y el elemento más a la derecha son iguales. Si es así, simplemente podemos soltar uno de ellos. En mi solución a continuación, dejo caer el elemento izquierdo siempre que el más a la izquierda sea igual al más a la derecha.

public int findMin(int[] num) {
    return findMin(num, 0, num.length-1);
}
 
public int findMin(int[] num, int left, int right){
    if(right==left){
        return num[left];
    }
    if(right == left +1){
        return Math.min(num[left], num[right]);
    }
    // 3 3 1 3 3 3
 
    int middle = (right-left)/2 + left;
    // already sorted
    if(num[right] > num[left]){
        return num[left];
    //right shift one
    }else if(num[right] == num[left]){
        return findMin(num, left+1, right);
    //go right    
    }else if(num[middle] >= num[left]){
        return findMin(num, middle, right);
    //go left    
    }else{
        return findMin(num, left, middle);
    }
}
  LeetCode - Eliminar duplicados de Sorted Array II (Java)

Solución Java 2: iteración

public int findMin(int[] nums) {
    int i=0;
    int j=nums.length-1;
 
    while(i<=j){
 
        //handle cases like [3, 1, 3]
        while(nums[i]==nums[j] && i!=j){
            i++;
        }
 
        if(nums[i]<=nums[j]){
            return nums[i];
        }
 
        int m=(i+j)/2;
        if(nums[m]>=nums[i]){
            i=m+1;
        }else{
            j=m;
        }
    }
 
    return -1;
}

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 *