LeetCode Pregunta 1: La suma de dos números
Descripción del Título
Dada una matriz de enteros nums
y un valor de destino target
, y encuentra que el valor de destino en la matriz de dos enteros y vuelve a su subíndice de matriz.
Puede suponer que cada entrada solo corresponderá a una respuesta. Sin embargo, no puede reutilizar los mismos elementos en esta matriz.
Ejemplo:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Algoritmo de búsqueda de fuerza bruta
Ideas de resolución de problemas: use dos ciclos para resolver
Código
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range (len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
Resultados y resumen
Tiempo de funcionamiento: 6132 ms Consumo de memoria: 14 MB
Aquí se utilizan dos bucles
Resolver con lista de funciones relacionadas en Python
método uno:
Ideas para resolución de problemas:
averigüe num2 == target - num1si está de moda listy luego use dos métodos:
- num2 in nums Devolver verdadero para indicar éxito
- nums.index(num2) Encuentra el índice de num2
Código
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums):
num1 = nums[i]
num2 = target - num1
if num2 in nums:
#如果num2=num1,且在nums中出现了一次,说明找到num1本身。
if(num1 == num2) & (nums.count(num2)==1):
continue
return[i,nums.index(num2,i+1)] #index(num2,i+1)是从num1后的序列找num2位置
Resultados y resumen
Tiempo de ejecución: 1148 ms Consumo de memoria: 14 MB
Aquí se usa un bucle
Método dos:
Idea de resolución de problemas: sobre la base del método 1, num2la búsqueda no necesita buscarse cada vez nums, puede buscar desde num1antes o después de acuerdo con la idea de segmentar . num1Lo busqué desde antes de este tiempo .
Código
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(1,len(nums)):
temp = nums[:i]
num1 = target - nums[i]
if num1 in temp:
j = temp.index(num1)
return[j,i]
Resultados y resumen
Tiempo de ejecución: 408 ms Consumo de memoria: 13,8 MB
Este algoritmo primero encuentra 7 en la lista [2,7,11,15] y luego encuentra 2. Por return[j,i]
lo tanto , devuelve j primero, luego i
Usa el diccionario para resolver
método uno:
Ideas para la resolución de problemas: use un diccionario para simular la resolución de hash, recorra la lista mientras busca el diccionario
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dct = {
}
for i, n in enumerate(nums):
if target-n in dct:
return [dct[target - n], i]
dct[n] = i #构造字典
Resultados y resumen
Tiempo de ejecución: 48 ms Consumo de memoria: 14,6 MB
- Este algoritmo primero usa [2,7,11,15] en la lista, 9-2 = 7 para encontrar 7 en el diccionario, pero en este momento el diccionario está vacío y 2 está almacenado en el diccionario;
- Luego use 9-7 = 2 para buscar en el diccionario En este momento, se almacena un 2 en el diccionario y se encuentran las posiciones de 7 y 2;
- Al regresar , es 9-7 = 2
return[dct[target - n],i]
en este momentotarget - n
, así que primero regrese a la posición 2 y luego regrese a la posición 7
resumen
La forma más fácil de usar un diccionario para resolver este problema es recorrer la lista y buscar el diccionario al mismo tiempo, pero también consume una cierta cantidad de memoria.