Categorías
Algorithms Interview

LeetCode: busque la primera y la última posición del elemento en una matriz ordenada (Java)

Dada una matriz ordenada de números enteros, encuentre la posición inicial y final de un valor objetivo dado. La complejidad del tiempo de ejecución de su algoritmo debe ser del orden de O (log n). Si el objetivo no se encuentra en la matriz, regrese [-1, -1]. Por ejemplo, dado [5, 7, 7, 8, 8, 10] y valor objetivo 8, retorno [3, 4].

Análisis

Basado en el requisito de O (log n), este es un problema de búsqueda binaria aparentemente.

Solución 1 de Java: registro (n)

Primero podemos encontrar el inicio y luego el final del objetivo.

public int[] searchRange(int[] nums, int target) {
    int l=0;
    int r=nums.length-1;
 
    while(l<r){
        int m=l+(r-l)/2;
        if(nums[m]<target){
            l=m+1;
        }else{
            r=m;
        }
    }
 
    int first=l;
    if(l<nums.length&&nums[l]==target){//l is in boundary and is the target
        l=0;
        r=nums.length-1;
        while(l<r){
            int m=l+(r-l+1)/2;
            if(nums[m]>target){
                r=m-1;
            }else{
                l=m;
            }
        }
 
        return new int[]{first, r};
    }
 
    return new int[]{-1,-1};
}

Solución Java 2 – (obsoleta)

public int[] searchRange(int[] nums, int target) {
    if(nums == null || nums.length == 0){
        return null;
    }
 
    int[] arr= new int[2];
    arr[0]=-1;
    arr[1]=-1;
 
    binarySearch(nums, 0, nums.length-1, target, arr);
 
    return arr;
}
 
public void binarySearch(int[] nums, int left, int right, int target, int[] arr){
    if(right<left) 
        return;
 
    if(nums[left]==nums[right] && nums[left]==target){
        arr[0]=left;
        arr[1]=right;
        return;
    }
 
    int mid = left+(right-left)/2;
 
 
    if(nums[mid]<target){
        binarySearch(nums, mid+1, right, target, arr);
    }else if(nums[mid]>target){
        binarySearch(nums, left, mid-1, target, arr);
    }else{
        arr[0]=mid;
        arr[1]=mid;
 
        //handle duplicates - left
        int t1 = mid;
        while(t1 >left && nums[t1]==nums[t1-1]){
            t1--;
            arr[0]=t1;
        }
 
        //handle duplicates - right
        int t2 = mid;
        while(t2 < right&& nums[t2]==nums[t2+1]){
            t2++;
            arr[1]=t2;
        }
        return;
    }
}
  LeetCode - Paréntesis válidos (Java)

En el peor de los casos, el tiempo de la segunda solución es en realidad O (n).

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 *