Middle+
20
Дана функция, принимающая две отсортированные по неубыванию последовательности целых чисел. Нужно вернуть все элементы из первой последовательности, которых нет во второй. Как вы подойдёте к решению и какова сложность?
Companies where asked
Яндекс
Answer from AI
sobes.tech AI
Поскольку обе последовательности отсортированы по неубыванию, оптимальным будет использовать два указателя (индекса), по одному для каждой последовательности, и идти по ним одновременно.
Алгоритм:
- Инициализируем два индекса i и j в 0.
- Пока i < len(A) и j < len(B):
- Если A[i] < B[j], значит элемент A[i] отсутствует во второй последовательности, добавляем его в результат и увеличиваем i.
- Если A[i] == B[j], элемент есть во второй последовательности, пропускаем его, увеличиваем i и j.
- Если A[i] > B[j], увеличиваем j, чтобы догнать A[i].
- После выхода из цикла, если остались элементы в A, добавляем их в результат, так как они точно отсутствуют во второй последовательности.
Сложность: O(n + m), где n и m — длины первой и второй последовательностей соответственно.
Пример на Go:
func differenceSorted(a, b []int) []int {
result := []int{}
i, j := 0, 0
for i < len(a) && j < len(b) {
if a[i] < b[j] {
result = append(result, a[i])
i++
} else if a[i] == b[j] {
i++
j++
} else {
j++
}
}
// Добавляем оставшиеся элементы из a
for i < len(a) {
result = append(result, a[i])
i++
}
return result
}