Aldea algorítmica de despacho de aduana: la aplicación de búsqueda binaria en expansión

1. El índice máximo de la matriz de montañas.

El índice máximo de la matriz de montaña
La matriz arr que cumple con las siguientes propiedades se denomina matriz de montaña:
arr.longitud >= 3
existe i (0 < i < arr.longitud - 1) tal que:
arr[0] < arr[ 1] < … arr [i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
te da la matriz arr de montañas de enteros, devuelve tal que arr[0] < arr [1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] para el índice i.

Tienes que diseñar e implementar una solución con complejidad de tiempo O(log(n)).

1.2. Travesía

La relación entre los elementos desde 0 hasta el objetivo está aumentando, y la relación entre el objetivo y el final está disminuyendo. Solo necesitas encontrar cuándo el primer elemento es más grande que el segundo elemento, es el pico de la montaña.

public int peakIndexInMountainArray(int[] arr) {
    
    
        for(int i=1;i<arr.length-1;i++){
    
    
            if(arr[i]>arr[i+1]){
    
    
                return i;
            }
        }
        return -1;
    }

Pero esto definitivamente no es posible, la complejidad del tiempo es O(n) no cumple las condiciones de O(logn)

2.2 Dicotomía

El título señala claramente que se requiere la complejidad del tiempo de uso de logn y que la dicotomía es más apropiada.
En primer lugar, según la dicotomía, hay tres estados, mayor que, menor que e igual a.
Y el estado de la matriz de picos es de

  1. bajo->medio está aumentando arr[medio] >arr[medio-1], arr[medio]<arr[medio+1]
  2. mid->hight son todos decrecientes arr[mid] < arr[mid-1] arr[mid]>arr[mid+1]
  3. encuentro el elemento superior
    public int peakIndexInMountainArray(int[] arr) {
    
    
        // 因为第一个元素必然是小于第二个元素的,所以可以从第二个元素开始
        int low = 1;
        // 同理最后一个元素是一定比倒数第二个元素小的
        int high = arr.length-2;
        while(low<=high){
    
    
            int mid = low+((high-low)>>1);
            // 处于递增情况
            if(arr[mid] > arr[mid-1] && arr[mid]< arr[mid+1]){
    
    
                low = mid+1;
                // 处于递减情况
            }else if(arr[mid] < arr[mid-1] && arr[mid]>arr[mid+1]){
    
    
                high=mid-1;
            }else{
    
    
                return mid;
            }
        }
        return -1;
    }

inserte la descripción de la imagen aquí

2. Encuentre el valor mínimo en una matriz ordenada rotada

Encuentre el valor mínimo en la matriz ordenada por rotación
Dada una matriz de longitud n, se organiza en orden ascendente de antemano, y después de 1 a n rotaciones, se obtiene la matriz de entrada. Por ejemplo, la matriz original nums = [0,1,2,4,5,6,7] se puede obtener después del cambio:
si se gira 4 veces, se puede obtener [4,5,6,7,0,1 ,2]
Si gira 7 veces, puede obtener [0,1,2,4,5,6,7]
Tenga en cuenta que la matriz [a[0], a[1], a[2], …, a [n-1] ] El resultado de una rotación es el arreglo [a[n-1], a[0], a[1], a[2], …, a[n-2]].

Se le proporciona una matriz nums con valores de elementos mutuamente diferentes, que originalmente era una matriz en orden ascendente y rotada varias veces como se describe anteriormente. Busque y devuelva el elemento más pequeño de la matriz.

Tienes que diseñar un algoritmo con complejidad de tiempo O(log n) para resolver este problema.

2.1 dos puntos

En primer lugar, las ventajas dicotómicas de la primera pregunta son similares, excepto que ahora el lado izquierdo del elemento más pequeño es más grande que él, y el lado derecho del elemento más pequeño también es más grande que él. La clave está en cómo comparar. La dicotomía anterior se basa en un determinado objeto de comparación. Si no hay una referencia, puede elegir el índice más a la derecha como valor de comparación. Si el valor de medio es mayor que el valor de alto, es significa que el valor objetivo debe estar entre medio-alto, mueva el puntero bajo en este momento, si el valor medio es menor que alto, significa que está en un estado creciente, la posición alta no debe ser la más pequeña, y a mid se le asigna el valor de alto.

 public int findMin(int[] nums) {
    
    
        int low = 0;
        int high = nums.length-1;
        while(low<high){
    
    
            int mid = low+((high-low)>>1);
            if(nums[mid] < nums[high]){
    
    
                high=mid;
            }else{
    
    
                low = mid+1;
            }
        }
        return nums[low];
    }

3. La espada se refiere a los números que faltan en la Oferta 53 - II.0~n-1

Sword Pointer Offer 53 - II Números faltantes de 0 a n-1
Todos los números en una matriz ordenada ascendente de longitud n-1 son únicos y cada número está en el rango de 0 a n-1. Entre los n números en el rango 0 ~ n-1, solo hay un número que no está en la matriz, encuentre este número.

3.1 dos puntos

Dado que todos los números están en 0-n-1, solo necesita comparar si los números correspondientes [mid] del valor medio actual son los mismos, luego mueva el puntero izquierdo, de lo contrario mueva el puntero derecho y finalmente deje la posición donde permanece el puntero izquierdo es el número que falta

 public int missingNumber(int[] nums) {
    
    
        int low = 0;
        int high = nums.length-1;
        while(low<=high){
    
    
            int mid = low+((high-low)>>1);
            if(nums[mid] == mid){
    
    
                low = mid+1;
            }else{
    
    
                high = mid-1;
            }
        }
        return low;
    }

4. LCR 072. Raíz cuadrada de x

Raíz cuadrada
Dado un entero no negativo x, calcule y devuelva la raíz cuadrada de x, es decir, implemente la función int sqrt(int x).
Hay dos raíces cuadradas positivas, y solo genera la raíz cuadrada positiva.
Si la raíz cuadrada no es un número entero, solo se mantiene la parte entera en la salida y se descarta la parte fraccionaria.

4.1 dos puntos

Suponga que la entrada es 4, la raíz cuadrada positiva es 2, el bajo es 1, el alto es 4, luego el valor intermedio es 2.5, el redondeo es 2, 4/2 es 2 conforme a la suposición de entrada 8, la raíz cuadrada positiva es 2, bajo es 1,
alto es 8, el medio es 4.5, redondeado a 4, 8/4=2<4 no está satisfecho, luego el puntero derecho se mueve alto=3, el valor medio es 2, 8/2= 4>2, el puntero izquierdo se mueve 2+1=3= Puntero derecho, termina la salida, el resultado es 2

 public int mySqrt(int x) {
    
    
        int low = 1; 
        int high =x;
        while(low<=high){
    
    
            int mid = low+((high-low)>>1);
            if(x/mid == mid){
    
    
                return mid;
            }else if(x/mid<mid){
    
    
                high=mid-1;
            }else{
    
    
                low=mid+1;
            }
        }
        return high;
    }

Mismo tema
69. La raíz cuadrada de x

Resumir

La idea de la dicotomía es la relación de tamaño entre los punteros izquierdo y derecho y los elementos del medio. Si se mencionan intervalos ordenados, considere usar bisección.

Supongo que te gusta

Origin blog.csdn.net/qq_52843958/article/details/132170790
Recomendado
Clasificación