LeetCode Brush Test_TwoSum (válido para pro-test)

LeetCode Pregunta 1: La suma de dos números

Descripción del Título

Dada una matriz de enteros numsy 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 momento target - 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.

Supongo que te gusta

Origin blog.csdn.net/qq_37766514/article/details/109251180
Recomendado
Clasificación