Другие ответы в порядке, но, как и я, если у вас возникли проблемы с пониманием вопроса, они не очень полезны. Давайте перефразируем вопрос:
Учитывая три набора целых чисел (назовите их A, B и C), найдите минимальный непрерывный диапазон, который содержит один элемент из каждого набора.
Существует некоторая путаница в отношении того, что представляют собой три набора. Во втором издании книги они обозначены как {1, 4, 5}
, {4, 9, 10}
и {5, 6, 15}
. Тем не менее, другая версия, которая была изложена в комментарии выше, это {1, 4, 5}
, {3, 9, 10}
и {2, 6, 15}
. Если одно слово не является суффиксом / префиксом другого, версия 1 невозможна, поэтому давайте перейдем ко второму.
Поскольку картинка стоит тысячи слов, давайте начертим точки:
Простая визуальная проверка вышесказанного показывает, что есть два ответа на этот вопрос: [1,3]
и [2,4]
, оба размера 3 (три точки в каждом диапазоне).
Теперь алгоритм. Идея состоит в том, чтобы начать с наименьшего допустимого диапазона и постепенно пытаться уменьшить его, перемещая левую границу внутрь. Мы будем использовать индексацию с нуля.
MIN-RANGE(A, B, C)
i = j = k = 0
minSize = +∞
while i, j, k is a valid index of the respective arrays, do
ans = (A[i], B[j], C[k])
size = max(ans) - min(ans) + 1
minSize = min(size, minSize)
x = argmin(ans)
increment x by 1
done
return minSize
где argmin
- индекс наименьшего элемента в ans
.
+---+---+---+---+--------------------+---------+
| n | i | j | k | (A[i], B[j], C[k]) | minSize |
+---+---+---+---+--------------------+---------+
| 1 | 0 | 0 | 0 | (1, 3, 2) | 3 |
+---+---+---+---+--------------------+---------+
| 2 | 1 | 0 | 0 | (4, 3, 2) | 3 |
+---+---+---+---+--------------------+---------+
| 3 | 1 | 0 | 1 | (4, 3, 6) | 4 |
+---+---+---+---+--------------------+---------+
| 4 | 1 | 1 | 1 | (4, 9, 6) | 6 |
+---+---+---+---+--------------------+---------+
| 5 | 2 | 1 | 1 | (5, 9, 6) | 5 |
+---+---+---+---+--------------------+---------+
| 6 | 3 | 1 | 1 | | |
+---+---+---+---+--------------------+---------+
n
= итерация
На каждом шаге один из трех индексов увеличивается, поэтому алгоритм гарантированно завершится. В худшем случае i
, j
и k
увеличиваются в этом порядке, и алгоритм выполняется за O(n^2)
(в данном случае 9). Для данного примера он заканчивается через 5 итераций.