Ideas y códigos de resolución de problemas para buscar matrices ordenadas rotadas y tratar con elementos repetidos (búsqueda binaria)

introducir:

La búsqueda a través de matrices ordenadas rotadas y el manejo de elementos duplicados son dos problemas comunes en la resolución de problemas algorítmicos. Esta publicación de blog presentará en detalle las ideas de resolución de problemas y la implementación del código de estos dos problemas, y explicará los pasos clave.

Tabla de contenido:

Rotación de búsqueda Array ordenado
Descripción del problema
Ideas para resolver problemas
Código de ejemplo
Manejar elementos repetidos Rotación de búsqueda Array ordenado
Descripción
del problema Ideas para resolver problemas
Código de ejemplo

Busque problemas de matrices ordenadas rotadas:

Descripción del Título:

Suponga que una matriz ordenada se gira alrededor de un pivote desconocido (por ejemplo, 0 1 2 4 5 6 7 podría convertirse en 4 5 6 7 0 1 2). Dado un valor objetivo para buscar. Si el valor de destino se encuentra en la matriz, se devuelve su índice; de ​​lo contrario, se devuelve -1. Se puede suponer que no hay elementos duplicados en la matriz.

Ideas para resolver problemas:

Usa la idea de la búsqueda binaria para resolver el problema. La clave es definir el alcance de la búsqueda en cada paso. Al comparar la relación de tamaño entre el elemento central y el elemento inicial, se juzga si el punto de rotación está a la izquierda o a la derecha, y luego el rango de búsqueda se actualiza hasta que se encuentra el valor objetivo o el rango de búsqueda está vacío.

Solución:

Defina dos punteros a la izquierda y a la derecha para señalar la posición de inicio y la posición final de la matriz, respectivamente.
Use un ciclo para iterar cuando izquierda <= derecha.
En cada iteración, el índice medio del elemento medio se calcula y se compara con el valor objetivo.
Si el elemento medio es igual al valor objetivo, devuelva mid directamente.
De lo contrario, juzgue si el punto de rotación está entre la izquierda y la mitad o entre la mitad + 1 y la derecha según la relación de tamaño entre el elemento central y el elemento inicial.
Si el punto de rotación está entre la izquierda y la mitad, y el valor objetivo está dentro de ese rango, actualice a la derecha hasta la mitad de 1.
De lo contrario, actualice de izquierda a mid+1.
Si aún no se encuentra el valor de destino al final del ciclo, significa que el valor de destino no existe en la matriz y se devuelve -1.

Código de muestra:

int searchInRotatedSortedArray(vector<int>& nums, int target) {
    
    
    int left = 0;
    int right = nums.size() - 1;

    while (left <= right) {
    
    
        int mid = left + (right - left) / 2;

        if (nums[mid] == target) {
    
    
            return mid;
        }

        if (nums[left] <= nums[mid]) {
    
    
            if (target >= nums[left] && target < nums[mid]) {
    
    
                right = mid - 1;
            } else {
    
    
                left = mid + 1;
            }
        } else {
    
    
            if (target > nums[mid] && target <= nums[right]) {
    
    
                left = mid + 1;
            } else {
    
    
                right = mid - 1;
            }
        }
    }

    return -1;
}

El problema de matriz ordenada rotada de búsqueda que trata con elementos duplicados:

Descripción del Título:

Suponga que una matriz ordenada se gira alrededor de un pivote desconocido (por ejemplo, 0 1 2 4 5 6 7 podría convertirse en 4 5 6 7 0 1 2). Dado un valor objetivo para buscar. Devuelve verdadero si el valor objetivo se encuentra en la matriz; de lo contrario, devuelve falso. Se puede suponer que hay elementos duplicados en la matriz.

Ideas para resolver problemas:

En el caso de tratar con elementos repetidos, necesitamos manejar el caso especial donde el elemento del medio es igual al elemento de inicio y desplazar la posición de inicio un bit a la derecha. Otras partes son similares a la solución anterior.

Si se permiten elementos repetidos, afectará la complejidad del tiempo de ejecución y requerirá la modificación de la solución original. Cuando se permiten elementos duplicados, es posible que los elementos inicial, medio y final de una matriz sean iguales. Esto hace que sea imposible determinar el intervalo en el que se encuentra el punto de rotación.

Solución

Para resolver este problema, necesitamos comparar el elemento medio con el elemento inicial y considerar los siguientes tres casos:

Si el elemento central es más grande que el elemento inicial, entonces el punto de rotación está a la derecha y podemos establecer que la posición inicial sea el medio más 1.
Si el elemento central es más pequeño que el elemento inicial, entonces el punto de rotación está a la izquierda y podemos establecer la posición final para que sea la posición central menos 1.
Si el elemento medio es igual al elemento de inicio y no se puede determinar el intervalo en el que se encuentra el punto de rotación, la posición de inicio se puede mover un bit a la derecha.

Código de muestra:

bool searchInRotatedSortedArray(vector<int>& nums, int target) {
    
    
    int left = 0;
    int right = nums.size() - 1;

    while (left <= right) {
    
    
        int mid = left + (right - left) / 2;

        if (nums[mid] == target) {
    
    
            return true;
        }

        if (nums[left] == nums[mid]) {
    
    
            left++;
        } else if (nums[left] < nums[mid]) {
    
    
            if (target >= nums[left] && target < nums[mid]) {
    
    
                right = mid - 1;
            } else {
    
    
                left = mid + 1;
            }
        } else {
    
    
            if (target > nums[mid] && target <= nums[right]) {
    
    
                left = mid + 1;
            } else {
    
    
                right = mid - 1;
            }
        }
    }

    return false;
}

en conclusión:

Esta publicación de blog presenta en detalle las ideas de resolución de problemas y la implementación de código de búsqueda y rotación de matrices ordenadas y el manejo de elementos repetidos. Al usar la idea de la búsqueda binaria, podemos buscar de manera eficiente el valor objetivo en la matriz ordenada rotada. Al mismo tiempo, en el caso de tratar con elementos repetidos, se debe prestar especial atención a la comparación entre el elemento medio y el elemento inicial. Espero que este artículo pueda ayudar a los lectores a comprender y resolver estos dos problemas, y usarlos de manera flexible en la programación real. Si desea profundizar en más detalles, consulte los libros y fuentes de algoritmos relevantes. ¡Buena suerte con tus problemas algorítmicos!

Supongo que te gusta

Origin blog.csdn.net/qq_46017342/article/details/131744980
Recomendado
Clasificación