Tabla de contenido
1 Regresar cuando se encuentre
2 Encuentra el margen izquierdo
3 Encuentra el límite correcto
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
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