Практика быстрого собеседования

Проблема с литкодом 31. Следующая перестановка просит нас переставить список чисел в лексикографически следующую перестановку этого списка чисел.

Наивное решение

Обычно наивное решение оказывается достаточно простым, но в данном случае это неверно. Чтобы попытаться получить список всех перестановок целых чисел.

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

Наивный код — на Swift

Примечание. Код для этого на самом деле такой же сложный, как и для более эффективного решения. Этот код также работает слишком долго для довольно жестких временных ограничений LeetCode на эту проблему.

Алгоритм Нараяны Пандиты — псевдокод

Например

1,2,3 при перестановке могут быть в альтернативном порядке (3,2,1; 3,1,2; 2,1,3; 2,3,1; 1,3,2) и из этих 1,3 ,2 является «следующим» после 1,2,3 из перечисленных выше альтернативных вариантов.

Алгоритм существует (из Википедии)

  • Найдите наибольший индекс k такой, что a[k] ‹ a[k + 1]. Если такого индекса нет, данная перестановка является последней перестановкой (и проблема LeetCode требует, чтобы мы возвращали отсортированный массив). Мы находим индекс неуместным, чтобы эта перестановка не была последней.
  • Найдите наибольший индекс i, больший k, такой, что a[k] ‹ a[i]. Найти элемент в правой части массива

Алгоритм Нараяны Пандиты — схематично

Код — на Swift

Хотите связаться? Свяжитесь с нами в Твиттере: