Задача «Сумма двух» - разбор алгоритмической задачи
Primary tabs
Forums:
Задача «Сумма двух» (Two Sum) — это классическая алгоритмическая задача, которая обычно формулируется так:
список чисел, найти порядковые номера (индексы) двух чисел из этого списка, которые в сумме дают заданное число-цель (target)
Например, для чисел:
2, 3, 7, 11, 15}и целевого числа 9
ответ будет:2 и 7
Оптимальное решение
Цель задачи - получить сложность O(N), относительно чтения массивы, т.е. линейную сложность
Главная идея:
- использовать хэш-мэп, чтобы хранить уже пройденные числа как ключи, а их индексы - как значения
- и искать в этом хэш-мэпе для очередного числа пару, получив значение для поиска как разность целевого числа (которое target) и текущего.
Возможная реализация (golang)
Рассмотрим код на golang:
package main
import "fmt"
func twoSum(nums []int, target int) []int {
seen := make(map[int]int) // инициаллизиуем хэш-таблицу
for i, value := range nums {
needed := target - value
if index, exists := seen[needed]; exists {
return []int{index, i}
}
seen[value] = i
}
return []int{}
}
func main() {
nums := []int{2, 3, 7, 11, 15}
target := 9
result := twoSum(nums, target)
if len(result) == 2 {
fmt.Printf("Индексы: %v (числа: %d + %d = %d)\n",
result, nums[result[0]], nums[result[1]], target)
} else {
fmt.Println("Пара не найдена")
}
}
- Log in to post comments
- 75 reads