Использование источника, цитируемого @ Fleischpfanzerl
Следующая лексикографическая перестановка
Мы выполняем следующие шаги, чтобы найти следующую лексикографическую перестановку:
nums = [0,1,2,5,3,3,0]
nums = [0]*5
curr = nums[-1]
pivot = -1
for items in nums[-2::-1]:
if items >= curr:
pivot -= 1
curr = items
else:
break
if pivot == - len(nums):
print('break') # The input is already the last possible permutation
j = len(nums) - 1
while nums[j] <= nums[pivot - 1]:
j -= 1
nums[j], nums[pivot - 1] = nums[pivot - 1], nums[j]
nums[pivot:] = nums[pivot:][::-1]
> [1, 3, 0, 2, 3, 5]
Итак, идея такова:
Идея состоит в том, чтобы следовать шагам -
- Найти индекс 'pivot' в конце массива, чтобы nums [i - 1]
- Найдите индекс j, такой что nums [j]> nums [pivot - 1]
- Поменяйте местами оба этих индекса
- Обратный суффикс, начинающийся с точки разворота