[Avance en el tema del algoritmo] Búsqueda binaria: busque la primera y la última posición de un elemento en una matriz ordenada (17)

Tabla de contenido

1. Análisis de preguntas

2. Principio del algoritmo

3. Escritura de código

Escribe al final:


1. Análisis de preguntas

Enlace de pregunta: 34. Encuentre la primera y última posición de un elemento en una matriz ordenada - LeetCode

Esta pregunta es para encontrar la posición inicial y final del valor objetivo en la matriz.

2. Principio del algoritmo

Si usamos directamente la bisección estándar aquí, si toda la matriz tiene el mismo número,

Degenerará en O(N), así que aquí necesitamos optimizarlo,

1. Comience el análisis encontrando el punto final izquierdo : sea x el valor medio y t el valor objetivo.

Si x <t, izquierda = medio + 1

Si x >= t, derecha = media (aquí combinamos las situaciones mayor que e igual)

Esta configuración es el resultado final cuando izquierda == derecha.

La forma en que encontramos el punto medio debe ser izquierda + (derecha - izquierda) / 2 (es decir, la forma de encontrar un número par)

De esta manera, cada paso estará cerca del punto final izquierdo y no caerá en un bucle infinito.

2. Analicemos y encontremos el punto final correcto :

Si x <= t, izquierda = media (¿por qué no usar + 1 aquí, porque si cae en el valor objetivo, se cruzará pronto?)

Si x > t, derecha = mitad - 1

De esta forma, cuando izquierda == derecha, será el resultado final.

Y la forma en que encontramos el punto medio es izquierda + (derecha - izquierda + 1) / 2

De esta manera, cada paso estará cerca del punto final correcto y no caerá en un bucle infinito.

3. Escritura de código

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size() == 0) return {-1, -1}; // 处理越界
        int left = 0, right = nums.size() - 1, begin = 0;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        
        if(nums[left] != target) return {-1, -1};
        else begin = left;

        left = 0, right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        return {begin, right};
    }
};

4. Plantilla bipartita

Al buscar el punto final izquierdo:

        mientras (izquierda <derecha) {

            int mid = izquierda + (derecha - izquierda) / 2;

            si(...) izquierda = medio + 1;

            de lo contrario, derecha = medio;

        }

while (left < right) {

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

	if (...) left = mid + 1;

	else right = mid;

}

Al buscar el punto final correcto:

        mientras (izquierda <derecha) {

            int mid = izquierda + (derecha - izquierda + 1) / 2;

            si(...) izquierda = medio;

            de lo contrario, derecha = mitad - 1;

        }

while (left < right) {

	int mid = left + (right - left + 1) / 2;

	if (...) left = mid;

	else right = mid - 1;

}

Escribe al final:

Ese es el contenido de este artículo, gracias por leer.

Si crees que has ganado algo, puedes darle un me gusta al blogger .

Si hay omisiones o errores en el contenido del artículo, envíe un mensaje privado al blogger o indíquelo en el área de comentarios ~

Supongo que te gusta

Origin blog.csdn.net/Locky136/article/details/131804239
Recomendado
Clasificación