Сегодня я собираюсь рассказать о трех решениях популярного LeetCode Вопрос о двух сумме.
Вопрос заключается в следующем: Учитывая массив чисел и целевой номер, верните индексы двух чисел, которые добавляют к целевому номеру.
Решения:
- O (n^2) Время, O (1) Пространство мы можем использовать два для петель, чтобы пройти через массив и найти показатели двух чисел, которые составляют целевой номер.
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]
- O (n) время, O (n) пространство Мы можем использовать хэш -таблицу для хранения чисел в качестве ключей и индексов в качестве значений. Затем мы проверяем, находится ли разница (цель – число) в хэш -таблице. Если это так, верните как индекс числа, так и индекс разницы.
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: values = {} for i, num in enumerate(nums): diff = target - num if diff in values: return [i, values[diff]] values[num] = i return []
- O (nlogn) время, O (1) пространство Вы можете использовать два метода указателя. После сортировки массива и создания массива чисел и их индексов создайте два указателя i и j, где и (массив) -1. Если сумма меньше цели, увеличение i, если больше, увеличение j. Если равны, верните индексы.
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: i = 0 j = len(nums) - 1 sortedNums = sorted(zip(nums, range(len(nums)))) while i < j: if sortedNums[i][0] + sortedNums[j][0] == target: return [sortedNums[i][1], sortedNums[j][1]] elif sortedNums[i][0] + sortedNums[j][0] < target: i += 1 elif sortedNums[i][0] + sortedNums[j][0] > target: j -= 1
Оригинал: “https://dev.to/xshirl/two-sum-leetcode-3afp”