Рефакторинг решения проблемы с двумя суммами в хэш-таблице

#python-3.x #algorithm

#python-3.x #алгоритм

Вопрос:

Я больше всего стараюсь решить проблему с двумя суммами в leetcode

Учитывая массив целых чисел, верните индексы двух чисел таким образом, чтобы они в сумме соответствовали определенной цели.

Можно предположить, что каждый ввод будет иметь ровно одно решение, и вы не можете использовать один и тот же элемент дважды.

Пример:

 Given nums = [2, 7, 11, 15], target = 9,

Because nums[0]   nums[1] = 2   7 = 9,
return [0, 1].
  

План:

1) перебор для повторения len (nums) O (n)
2) поиск целевого числа[i] с помощью хэш-таблицы O (1)

Реализовать

 class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        nums_d = {}
        for i in range(len(nums)):
            nums_d.setdefault(nums[i], []).append(i)

        for i in range(len(nums)):
            sub_target = target - nums[i]
            nums_d[nums[i]].pop(0) #remove the fixer
            result = nums_d.get(sub_target)#hash table to search 

            if result: 
                return [i, result[0]]
        return []
  

Я потратил часы на это решение, но обнаружил, что ответ принят, но не набрал 60 баллов.

Время выполнения: 60 мс, быстрее, чем 46,66% онлайн-заявок на Python3 для Two Sum. Использование памяти: 16,1 МБ, менее 5,08% онлайн-заявок на Python3 для Two Sum.

Я хочу реорганизовать коды так, чтобы достичь по крайней мере скорости, превышающей 60%.

Не могли бы вы, пожалуйста, дать подсказки?

Комментарии:

1. Об этом лучше спросить здесь: codereview.stackexchange.com

2. Подсказка: Может ли ваша программа обработать случай [2, 2], цель 4?

Ответ №1:

Похоже, что подход 3 на вкладке «Решение» в задаче на LeetCode выполняется быстрее, чем на 80%. Вот неполный код, который вам нужно заполнить:

 def twoSum(self, nums: List[int], target: int) -> List[int]:
  map = # ???
  for i in range(len(nums)):
    complement = # ???
    if complement in map:
      return # ???
    map[nums[i]] = # ???