2016-03-01 2 views

ответ

0

Вот является greedy алгоритм, который должен работать:

Choose Next Number (lastChoosenIndex, k) { 

    minNum = Find out what is the smallest number from lastChoosenIndex to ArraySize-k 

    //Now we know this number is the best possible candidate to be the next number. 
    lastChoosenIndex = earliest possible occurance of minNum after lastChoosenIndex 

    //do the same process for k-1 
    Choose Next Number (lastChoosenIndex, k-1) 
} 

Алгоритм выше - высокая сложность.

Но мы можем pre-sort все элементы массива paired с их array index и сделать тот же процесс жадно, используя один цикл. Поскольку мы использовали сложность сортировки, все равно будет n*log(n)

+0

Это имеет смысл, но нет ли такого подхода к динамическому программированию? – v1kas

+1

посмотреть здесь ожидаемый размер последовательности 'k' фиксирован. И вы хотите, чтобы lex был наименьшим из этих размеров. Любой подход к динамическому программированию, я думаю, является высокой сложностью и в основном заканчивается тем, что делает жадный подход. –

0
  1. Предлагаю вам попробовать использовать модифицированную сортировку слияния. Место для
  2. изменено является частью слияния, отбросить дублирующее значение.
  3. выбрать наименьшее четыре

Сложность O (N LOGN) Продолжая думать, может ли сложность быть O (N)

+0

Это решение никогда не будет работать. Выбор самых маленьких - это не намерение. Намерение выбора минимальной последовательности лексикографии. Как пример: для ввода '2 1 1 1 9 9 9' выбор' 1 9 9 9' лучше, чем '2 1 1 1'. –

Смежные вопросы