Map
m := make(map[string]int)
m["go"]++
value, ok := m["go"]
delete(m, "go")
Поиск и вставка в среднем O(1); порядок обхода не определён.
В Go встроенная map закрывает задачи на частоты, множества и индексы.
Минимальный синтаксис, который понадобится в решении.
m := make(map[string]int)
m["go"]++
value, ok := m["go"]
delete(m, "go")
Поиск и вставка в среднем O(1); порядок обхода не определён.
seen := make(map[int]struct{})
seen[42] = struct{}{}
_, exists := seen[42]
struct{} не занимает места под значение.
freq := map[rune]int{}
for _, ch := range text {
freq[ch]++
}
Частоты часто превращают вложенный поиск O(n²) в O(n).
Три идиоматичных решения на Go с оценкой времени и памяти.
Храним индекс уже увиденного дополнения.
O(n) time · O(n) spacefunc twoSum(nums []int, target int) []int {
seen := make(map[int]int)
for i, n := range nums {
if j, ok := seen[target-n]; ok {
return []int{j, i}
}
seen[n] = i
}
return nil
}
Массив частот становится сравнимым ключом map.
O(n · k) time · O(n · k) spacefunc groupAnagrams(words []string) [][]string {
groups := map[[26]int][]string{}
for _, word := range words {
var key [26]int
for _, ch := range word { key[ch-'a']++ }
groups[key] = append(groups[key], word)
}
out := make([][]string, 0, len(groups))
for _, group := range groups { out = append(out, group) }
return out
}
Множество мгновенно показывает, встречалось ли значение раньше.
O(n) time · O(n) spacefunc containsDuplicate(nums []int) bool {
seen := make(map[int]struct{}, len(nums))
for _, n := range nums {
if _, ok := seen[n]; ok { return true }
seen[n] = struct{}{}
}
return false
}