Binaria rotación de búsqueda LeetCode33 ordenadas gama

Buscar en girada Ordenado matriz

descripción

Supongamos que una matriz ordenada, y luego el pivote de rotación de acuerdo a uno, tal como [1,2,3,4,5,6,7,8] -> [6,7,8,1,2,3,4 5].
Su tarea consiste en rotar hallazgo la matriz después de un número en el subíndice, tal como subíndice 6 a 1, y si este número no existe, se devuelve -1.
Requisitos: Tiempo de complejidad de O (log (n))

solución

  • Obviamente, habrá que esperar para ver divide y vencerás logn (divide y vencerás). Cómo utilizar el D & C Hay tres maneras
      1. Este problema forma más fácil es a través de divide y vencerás en primer lugar encontrar el pivote se mencionó anteriormente, la parte posterior Go "giro", después va a tener este número.
      1. De acuerdo a la función de "giro", además de la matriz se encuentra en algún lugar se produjo el paso, el otro va en aumento. Mediados no importa dónde, siempre hay un lado (a la izquierda> mediados, mediano> derecha ) es monótonamente creciente. Así que siempre podemos incrementalmente determinar la relación entre la posición del medio y de destino bordes.
      1. Para otros 2 resume el método mejorado, nums[0]<=target, target<=nums[i], nums[i]<nums[0]las tres condiciones contiene todas las circunstancias, y luego XOR escribieron una manera concisa: https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ solución / ji-Jian-solución by-lukelee /

Condiciones de contorno

  • Obviamente, lo anterior no es difícil pensar en ideas, pensamos que al menos el segundo paso se puede hacer, pero las condiciones de contorno todavía tienen que pensar.
  • algoritmo de búsqueda binaria Límite, generalmente dividida en dos casos, uno se deja intervalo derecha abierto cerrado, similar a la [izquierda, derecha), uno se queda cerca derecho cerca, similar a la [izquierda, derecha]. Cabe señalar es cíclico en condiciones in vitro de inicialización, el bucle de paso de iteración del cuerpo, debe cumplir con las normas de intervalo constante.
  • La mejor forma de perlas de programación dado:
int search4(int array[], int n, int v)
{
int left, right, middle;

left = -1, right = n;

while (left + 1 != right)
{
    middle = left + (right - left) / 2;

    if (array[middle] < v)
    {
        left = middle;
    }
    else
    {
        right = middle;
    }
}

if (right >= n || array[right] != v)
{
    right = -1;
}

return right;
}

Referencia: https://blog.csdn.net/weixin_43705457/article/details/87874779

Supongo que te gusta

Origin www.cnblogs.com/SsoZhNO-1/p/12498466.html
Recomendado
Clasificación