Rutina de algoritmo-búsqueda binaria

Tabla de contenido

 

1 Regresar cuando se encuentre

2 Encuentra el margen izquierdo

3 Encuentra el límite correcto

4 Gire la matriz

4.1 Encuentra el valor mínimo en la matriz rotada

4.2 Encuentra un valor específico en la matriz rotada

 


La búsqueda binaria más propensa a errores es el procesamiento de condiciones de contorno. Después de encontrarme con este problema, cometer errores y enredarme muchas veces, finalmente me decidí a superar este problema, para que la próxima vez que me encuentre con el problema dicotómico, pueda hacerlo con facilidad.

1 Regresar cuando se encuentre

Este es el más simple: si el valor de la mediana es mayor que el objetivo, vaya a la izquierda, si es menor que el objetivo, vaya a la derecha y busque el objetivo cuando sea igual al objetivo.

Ejemplo de Leetcode: 69. Raíz cuadrada de x

2 Encuentra el margen izquierdo

Por ejemplo, a = [2,3,3,4,6], encuentre el primer subíndice con un valor de 3.

Comience con left = 0, right = 4, mid = 2, encuentre el subíndice 2 por primera vez,

right = 2, left = 0, mid = 1, es decir, encontré un subíndice con un valor de 3. No sé si es el primero, así que lo puse en el extremo derecho.

Si todavía hay un valor de 3 al frente, establezca el anterior en el extremo derecho y luego derecho = 1

 

Condiciones de terminación Algunas personas están acostumbradas a izquierda <= derecha, entonces izquierda = derecha + 1 al final del ciclo. Pero todavía me gusta la forma de left <right, de modo que cuando finalice el ciclo, left == right, y luego juzgar si nums [left] o nums [right] es el objetivo, si lo es, se encontrará, o el objetivo no existe.

class Solution:
    def minEatingSpeed(self, nums: List[int], target: int) -> int:
        left,right=1,len(nums)-1
        while left<right:
            mid=(left+right)//2#mid值偏左
            if nums[mid]>=target: 
              	right=mid#因为找左边界,对可能的右边界就宽容
            else: 
                left=mid+1
        return left

Preguntas de ejemplo de Leetcode:

278. La primera versión incorrecta

875.

34. Encuentra la primera y última posición de un elemento en una matriz ordenada.

3 Encuentra el límite correcto

class Solution:
    def minEatingSpeed(self, nums: List[int], target: int) -> int:
        left,right=1,len(nums)-1
        while left<right:
            mid=(left+right+1)//2#mid值偏右
            if nums[mid]<=target: 
              	left=mid#因为找右边界,对可能的左边界就宽容
            else: 
                right=mid-1
        return left

34. Encuentra la primera y última posición de un elemento en una matriz ordenada.

4 Gire la matriz

4.1 Encuentra el valor mínimo en la matriz rotada

Ideas:

Si nums [mid] <nums [right], significa que el lado derecho está ordenado y el valor mínimo no está en el medio sino en el izquierdo, entonces right = mid

Si nums [mid]> nums [right], significa que el lado izquierdo está en orden, el valor mínimo está a la derecha, left = mid + 1

Si nums [mid] == nums [right], no puede juzgar qué lado está en orden, right- = 1

 

Sin repetición

153. Encuentra el valor más pequeño en una matriz ordenada rotada

Hay duplicados

154. Encuentre el valor más pequeño en una matriz ordenada rotada II

4.2 Encuentra un valor específico en la matriz rotada

81. Buscar matriz ordenada rotada II

Ideas:

  • Si nums [mid] <nums [right], significa que la derecha está en orden y el objetivo está a la izquierda si no está a la derecha

  • Si nums [mid]> nums [right], significa que el lado izquierdo está ordenado y el objetivo no está a la izquierda, sino a la derecha.

  • Si nums [mid] == nums [right], no puede juzgar qué lado está en orden, right- = 1

#找旋转数组中的特定值是否存在代码 
class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        left,right=0,len(nums)-1
        mid=0
        if len(nums)==0:return False
        while left<right:
            mid=(left+right)//2
            if nums[mid]==target:return True
            if nums[mid]<nums[right]:
                if target>nums[mid] and target<=nums[right]:
                    left=mid+1
                else:
                    right=mid-1
            elif nums[mid]>nums[right]:
                if target>=nums[left] and target<nums[mid]:
                    right=mid-1
                else:
                    left=mid+1
            else:
                right-=1
        return nums[right]==target

 

Supongo que te gusta

Origin blog.csdn.net/nanfeizhenkuangou/article/details/110634491
Recomendado
Clasificación