Решение - O(N)
, и нет необходимости выполнять какие-либо исчисления, хотя это помогает понять форму кривой.
Ответы выше делают наиболее интуитивную вещь и решают уравнение длянайдите минимум или максимум и затем разбейте список.
Преимущество в вычислении первой производной есть, но нет необходимости делать это на самом деле, а также нам не нужно находить максимальную или минимальную точку в это время.
Просто знайте, что он может двигаться в одном направлении, а затем назад в другом, но никогда не изменит направление более одного раза.
Мы собираемся начать с каждого конца и повторять по обе стороныпока мы не сольемся где-то посередине.Прежде чем делать что-то еще, нам нужно проверить направление на каждом конце, что мы сделаем, просто сравнив два последних элемента.Итак, мы видим, движется ли один конец вверх, а другой вниз.
Если у нас есть N
элементов, скажем, у нас есть данные X[0]
и X[N-1]
, поэтому рассчитайте f(X[0])
и f(X[N-1])
и f(X[1])
и f(X[N-2])
.Если f(X[0]) < f(X[1])
и f(X[N-1]) > f(X[N-2])
, то фактически все наши данные являются одной стороной от максимума / минимума и, таким образом, уже отсортированы.То же самое, если сравнения в другом направлении.(Для одного направления может потребоваться обратное направление).
В противном случае просто выполните объединение с обоих концов, поэтому f(X[0])
и f(X[N-1])
являются максимумами или минимумами их поддиапазонов (мы знаем из более ранних сравнений)и создайте объединенный список в любом подходящем направлении.
Применение к вашим данным:
-1 0 1 2 3 4
A = -1, B = 2, C = -1`
f = [ -4, -1, 0, -1, -4, -9 ]
-4 < -1
и -9 < -4
, поэтому мы пересекаем точку и получаем минимумы накаждый конец.
-9 is lower than -4
-4 and -4 are equal so push both
-1 and -1 are equal so push both
0 remains.
our sequence is [-9, -4, -4, -1, -1, 0 ]