1.1 Array - Búsqueda binaria (Leetcode 0704)

1. Tema

Enlace Leetcode
Dada una matriz ordenada (ascendente) de números enteros con n elementos y un objetivo de valor objetivo, escriba una función para buscar el objetivo en números y devuelva el subíndice si existe el valor objetivo; de lo contrario, devuelva -1.

Entrada: nums = [-1,0,3,5,9,12], target = 9
Salida: 4
Explicación: 9 aparece en nums con subíndice 4

Entrada: nums = [-1,0,3,5,9,12], destino = 2
Salida: -1
Explicación: 2 no existe en nums, por lo que devuelve -1

2. Ideas

La premisa de usar la dicotomía : matriz ordenada + sin elementos duplicados en la matriz

En general, hay dos definiciones de intervalos dicotómicos , cerrado a la izquierda y cerrado a la derecha [izquierda, derecha], o cerrado a la izquierda y abierto a la derecha [izquierda, derecha]

3. Implementación del código

3.1 Método de escritura 1: Izquierda cerrada y derecha cerrada


class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        // 定义初始左闭右闭区间[left, right]
    	int left = 0;
    	int right = nums.size() - 1;
		// 进行区间遍历,注意左闭右闭的区间对应的是<=
		while(left <= right){
    
    
			// middle的防止溢出写法,等同于(right+left) / 2
			int middle = left + (right - left) / 2;

            // 分成三种情况
			if (nums[middle] > target){
    
    
                right = middle - 1; // 新的区间落入原来的左半区间
            }
            else if (nums[middle] < target){
    
    
                left = middle + 1; // 新的区间落入原来的右半区间
            }
            else{
    
    
                return middle; // nums[middle] == target
            }
        }
        return -1; // 未找到目标值

    }
};

3.2 Método de escritura 2: Izquierda cerrada y derecha abierta

class Solution {
    
    
public:
    int search(vector<int>& nums, int target) {
    
    
        // 定义初始左闭右开区间[left, righ)
    	int left = 0;
    	int right = nums.size() ;
		// 进行区间遍历,注意左闭右开的区间对应的是<,因为取不到“right”对应位置的元素
		while(left < right){
    
    
			// middle的防止溢出写法,等同于(right+left) / 2
			int middle = left + (right - left) / 2;

            // 分成三种情况,注意要带着左闭右开的区间思想[left, right)
			if (nums[middle] > target){
    
    
                right = middle ; // 新的区间落入原来的左半区间, 右开, [left, middle)
            }
            else if (nums[middle] < target){
    
    
                left = middle + 1; // 新的区间落入原来的右半区间, 左闭, [middle + 1, right)
            }
            else{
    
    
                return middle; // nums[middle] == target
            }
        }
        return -1; // 未找到目标值

    }
};

4. Resumen

4.1 Método de escritura antidesbordamiento

// middle的防止溢出写法,等同于(right+left) / 2
int middle = left + (right - left) / 2;

4.2 Paridad de la longitud de la matriz

  • Independientemente de si la matriz es par o impar, toda la matriz se recorrerá de acuerdo con la longitud de la matriz;
  • La influencia de la paridad de la longitud de la matriz se refleja en el valor de la posición media, (derecha+izquierda) / 2
4.3 La clave de la dicotomía: la comprensión de la definición del intervalo
  • Realice el procesamiento de límites de acuerdo con la definición del intervalo de búsqueda
  • La definición de un intervalo es un invariante, por lo que insistir en realizar un procesamiento de límites de acuerdo con la definición del intervalo de búsqueda en el ciclo es la regla invariante del ciclo.

Supongo que te gusta

Origin blog.csdn.net/weixin_46297585/article/details/122572956
Recomendado
Clasificación