Хороший ответ: https://leetcode.com/articles/beautiful-array/
Скажите a < b < c
и b - a = c - b
.Тогда
2 * b = a + c
Поскольку 2 * b
всегда четен, чтобы прервать любую прогрессию, a
и c
должны иметь разное соотношение.Но группировки шансов в одну сторону и четных в другую недостаточно, поскольку, если у нас более 4 чисел, мы можем генерировать арифметическую прогрессию в одной из групп.
Здесь мы можем использовать рекурсивную идеюв статье, чтобы сломать его.Один из способов, который я понимаю, состоит в том, что если у нас есть решение для размера массива N
, поскольку арифметическая прогрессия зависит от различий между числами, мы можем сопоставить данное решение с помощью арифметической функции с тем же эффектом:
if [a, b, c, d] works,
then [2*a, 2*b, 2*c, 2*d] works too
and so does [2*a - 1, 2*b - 1, 2*c - 1, 2*d - 1]
Поэтому все, что нам нужно сделать, - это сопоставить меньшее решение: один раз с четными числами и один раз с коэффициентами и сгруппировать их отдельно.(Разделение групп ограничивает проблему нарушением арифметической прогрессии в каждой группе, поскольку, как мы показали, никакая прогрессия (a, b, c)
не будет зависеть от a
и c
различных соотношений.)
N1 -> [1]
N2 -> even map N1 + odd map N1
[2*1] + [2*1 - 1]
[2, 1]
N3 -> even map N1 + odd map N2
[2*1] + [2*2 - 1, 2*1 - 1]
[2, 3, 1]
...
N6 -> even map N3 + odd map N3
[2*2, 2*3, 2*1] + [2*2 - 1, 2*3 - 1, 2*1 - 1]
[4, 6, 2, 3, 5, 1]