Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento
describir
Dada una matriz de números enteros ordenados en orden ascendente y un objetivo entero, escriba una función para buscar el objetivo en números. Si el objetivo existe, devuelve su índice. De lo contrario, devuelve -1.
Debe escribir un algoritmo con una complejidad de tiempo de ejecución O(log n).
Ejemplo 1:
Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4
复制代码
Ejemplo 2:
Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
复制代码
Nota:
1 <= nums.length <= 10^4
-10^4 < nums[i], target < 10^4
All the integers in nums are unique.
nums is sorted in ascending order.
复制代码
Analizar gramaticalmente
De acuerdo con el significado de la pregunta, dada una matriz de números enteros ordenados en orden ascendente y un objetivo entero, escriba una función para buscar el objetivo en números. Si el destino existe, se devuelve su índice. De lo contrario, devuelve -1. El título ha establecido claramente que tenemos que escribir un algoritmo con una complejidad de tiempo de ejecución O(log n).
Mirando las palabras clave del tema "matriz", "ordenar", "buscar", "objetivo", "O(log n) complejidad de tiempo", entonces esta pregunta es definitivamente el método de búsqueda binaria, como dice el título "Búsqueda binaria ". Entonces la solución es muy clara, es decir, utilizar el método de búsqueda binaria para resolver el problema. La idea es sencilla:
- Inicializamos dos punteros i y j para que apunten a la cabeza y la cola de nums respectivamente
- Realice el ciclo while, encontramos la posición media mid = (i + j) // 2, y luego comparamos, si nums[mid] es igual al objetivo, entonces podemos encontrar el objetivo y devolver el índice directamente; si nums [mid] es mayor que el objetivo, entonces significa que el objetivo puede estar en la primera mitad, por lo que debemos asignar mid-1 a j; si nums[mid] es menor que el objetivo, significa que el objetivo puede estar en la mitad segunda mitad, por lo que debemos asignar mid + 1 a i;
- Bucle hasta i>j, significa que no se puede encontrar, simplemente devuelva -1 directamente
La complejidad temporal es O(log n) y la complejidad espacial es O(1).
responder
class Solution(object):
def search(self, nums, target):
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
j = mid - 1
else:
i = mid + 1
return -1
复制代码
resultado de la operación
Runtime: 279 ms, faster than 41.48% of Python online submissions for Binary Search.
Memory Usage: 14.6 MB, less than 78.69% of Python online submissions for Binary Search.
复制代码
Enlace del título original
Tu apoyo es mi mayor motivación.