2020-12-25Niuke y Leetcode de hoy == Búsqueda binaria de matriz ordenada con números repetidos + matriz ordenada rotada para encontrar el valor objetivo + número mínimo de matriz rotada

Fuente: Enlace: https://www.nowcoder.com/practice/7bc4a1c7c371425d9faa9d1b511fe193?tpId=188&&tqId=36844&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question
I violate Statement Los derechos de cualquier persona, comuníquese conmigo y lo eliminaré.
Bienvenidos expertos para rociarme

Descripción del título Implemente la búsqueda binaria para matrices ordenadas con números repetidos.

La salida es la primera posición en la matriz que es mayor o igual que el valor de búsqueda. Si no hay tal número en la matriz, la longitud de la matriz de salida aumenta en uno.

Ejemplo 1
Entrada 5,4, [1,2,4,4,5]
Valor de retorno 3
La posición de salida se calcula a partir de 1

Código, los detalles dicotómicos son el diablo
import java.util.*; 
public class Solution {
    /**
     * 二分查找
     * @param n int整型 数组长度
     * @param v int整型 查找值
     * @param a int整型一维数组 有序数组
     * @return int整型
     */
    public int upper_bound_ (int n, int v, int[] a) { 
        //数组是排序好的, 那么判断最后一个值大于查找值,那么没有查找的意义了
        if(a[n-1] < v) return n+1;
        
        int left = 0, right = a.length;
        
        while(left < right){  
            int mid = left + (right - left)/2;
            if(a[mid] > v) right = mid;
            else if(a[mid] < v) left = mid+1; 
            //这里是应对重复值得思路
            //重复值,就顺序查找
            else{ //a[mid] == v
                while(mid >=0 && a[mid]==v) mid--;
                //为什么是+2???因为此时mid指向小于v的最后一个值,
                //mid+1指向等于v的第一个值,mid+1+1才是 符合“输出位置从1开始计算 ”的结果
                return mid+2;
            }
        }
        //输出位置从1开始计算 所以加1
        return left + 1;
    }
}
El título describe la matriz ordenada rotada para encontrar el valor objetivo

Dada una matriz ordenada que se ha rotado, no sabe cuánto se ha rotado la matriz de antemano
(por ejemplo, 0 1 2 4 5 6 7 puede convertirse en 4 5 6 7 0 1 2).
Busque el objetivo dado valor en la matriz, si se puede encontrar en la matriz, devuelve su índice; de ​​lo contrario, devuelve -1.
Suponga que no hay duplicados en la matriz.
Ejemplo 1
entrada [1], 0
valor de retorno -1
Ejemplo 2
entrada [3,
2 , 1], 1 valor de retorno 2

Puntos de código: 1 Arr [mid] = objetivo 2: La mitad derecha está en orden 3: La mitad izquierda está en orden

Después de dividir uniformemente la matriz giratoria, siempre se ordena un lado, como por ejemplo:

10 11 12 13 14 15 1 2 3
10 11 15 1 2 3 4 5 6 7 8 Después de
ubicar el lado ordenado, compare los límites izquierdo y derecho del objetivo y el subarreglo ordenado, y luego podemos buscar el toma de decisiones del lado izquierdo o del lado derecho.

import java.util.*; 
public class Solution {
    /**
     * 
     * @param A int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] A, int target) {
        // write code here
        int left = 0, right = A.length-1;
        while(left <= right){
            int mid = left + (right-left)/2;
            if(A[mid] == target) return mid;
            else if(A[mid] < A[right]){ //右半部有序
                if(A[mid] < target && target <= A[right]) left = mid+1;
                else right = mid - 1;
            }else{ //左半部有序
                if(target < A[mid] && A[left]<= target) right = mid-1;
                else left = mid + 1;
            }
        } 
        //不要想太多,找不到就返回-1
        return -1;
    }
}  
Título Descripción La espada se refiere a la Oferta 11. Gire el número más pequeño de la matriz

Enlace: https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof

Mover los primeros elementos de una matriz hasta el final de la matriz se denomina rotación de la matriz. Ingrese una rotación de una matriz ascendente y emita el elemento más pequeño de la matriz girada. Por ejemplo, la matriz [3,4,5,1,2] es una rotación de [1,2,3,4,5] y el valor mínimo de la matriz es 1.
Ejemplo 1:
Entrada: [3,4,5,1,2]
Salida: 1
Ejemplo 2:
Entrada: [2,2,2,0,1]
Salida: 0

Dicotomía de los detalles del código

Consideramos el último elemento x en la matriz: los elementos a la derecha del mínimo deben tener todos sus valores menores o iguales ax;
y los elementos a la izquierda del mínimo deben tener todos sus valores mayores que o igual ax. Por lo tanto, podemos encontrar el valor mínimo mediante una búsqueda binaria basada en esta propiedad.

  • El primer caso es números [pivote] <números [alto]. Esto muestra que números [pivote] es el elemento a la derecha del valor mínimo, por lo que podemos ignorar la mitad derecha del intervalo de búsqueda binaria.
  • El segundo caso es números [pivote]> números [alto]. Esto muestra que números [pivote] es el elemento a la izquierda del valor mínimo, por lo que podemos ignorar la mitad izquierda del intervalo de búsqueda binaria.
  • El tercer caso son los números [pivote] == números [altos]. Debido a la existencia de elementos repetidos, no podemos estar seguros de si los números [pivote] están a la izquierda oa la derecha del valor mínimo.
class Solution {
    public int minArray(int[] numbers) {
        int left = 0, right = numbers.length-1;
        while(left <= right){
            int mid = left + (right - left)/2;
            if(numbers[mid] < numbers[right]){
            //这里为什么不是right-1??因为mid这个值是小值,可能是我的所求,所以到带入下一次比较
                right = mid;
            }else if(numbers[mid] > numbers[right]){
                left = mid+1;
            }else{
                right--;
            }
        }
        return numbers[left];
        
    }
}
Dos puntos resumidos por el gran dios, varios detalles y varias aplicaciones.

Explicación detallada del algoritmo de búsqueda binaria https://www.cnblogs.com/kyoner/p/11080078.html

Supongo que te gusta

Origin blog.csdn.net/qq_45531729/article/details/111680807
Recomendado
Clasificación