По заданному массиву найдите следующий меньший элемент для каждого элемента. - PullRequest
28 голосов
/ 29 февраля 2012

Учитывая массив, найдите следующий меньший элемент в массиве для каждого элемента без изменения исходного порядка элементов.

Например, предположим, что данный массив равен 4,2,1,5,3.

Результирующий массив будет 2,1, -1,3, -1.

Мне задали этот вопрос в интервью, но я не мог придумать решение лучше, чем тривиальное решение O (n ^ 2). Любой подход, который я мог бы придумать, то есть создание бинарного дерева поиска или сортировка массива, исказит исходный порядок элементов и, следовательно, приведет к неверному результату.

Любая помощь будет принята с благодарностью.

Ответы [ 11 ]

0 голосов
/ 29 февраля 2012

Вот наблюдение, которое, я думаю, можно превратить в решение O (n log n). Предположим, у вас есть ответ для последних k элементов массива. Что вам нужно для того, чтобы определить значение элемента непосредственно перед этим? Вы можете думать о последних k элементах как о разделенных на серию диапазонов, каждый из которых начинается с некоторого элемента и продолжается до тех пор, пока не достигнет меньшего элемента. Эти диапазоны должны быть в порядке убывания, поэтому вы можете подумать о том, чтобы выполнить бинарный поиск по ним, чтобы найти первый интервал, меньший, чем этот элемент. Затем вы можете обновить диапазоны, чтобы учесть этот новый элемент.

Теперь, как лучше это представить? Лучший способ, о котором я подумал, - это использовать Splay Tree, ключи которого - это элементы, определяющие эти диапазоны, а значения - это индекс, с которого они начинаются. Затем вы можете за время O (log n) амортизировать выполнить поиск предшественника, чтобы найти предшественника текущего элемента. Это находит самое раннее значение меньше текущего. Затем за время амортизации O (log n) вставьте текущий элемент в дерево. Это представляет собой определение нового диапазона от этого элемента вперед. Чтобы отбросить все диапазоны этого супердея, вы затем вырезаете правый дочерний элемент нового узла, который, поскольку это дерево сопряжения находится в корне, из дерева.

В целом, это делает O (n) итераций процесса O (log n) для всего O (n lg n).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...