Problem #
Given an array. Find the next permutation that rearranges the array into the next lexicographical order. If there is no next permutation, rearrange the array into the lowest possible order.
Examples #
[2, 4, 1, 7, 5, 0]➜[2, 4, 5, 0, 1, 7][3, 4, 2, 5, 1]➜[3, 4, 5, 1, 2][3, 2, 1]➜[1, 2, 3]As
[3, 2, 1]is the last permutation, the next permutation is the lowest one.
Constraints #
1 ≤ arr.size() ≤ 10⁵0 ≤ arr[i] ≤ 10⁵
Expected Complexities #
Time Complexity:
Auxiliary Space:
Solution #
Numeric = int | float
def find_next_permutation(arr: list[Numeric]) -> list[Numeric]:
n: int = len(arr)
def reverse(left_index: int, right_index: int) -> None:
while left_index < right_index:
arr[left_index], arr[right_index] = arr[right_index], arr[left_index]
left_index += 1
right_index -= 1
pivot_index: int = -1
for i in range(n - 2, -1, -1):
if arr[i] < arr[i + 1]:
pivot_index = i
break
if pivot_index == -1:
reverse(0, n - 1)
return arr
for i in range(n - 1, pivot_index, -1):
if arr[i] > arr[pivot_index]:
arr[i], arr[pivot_index] = arr[pivot_index], arr[i]
break
reverse(pivot_index + 1, n - 1)
return arr
print(find_next_permutation([2, 4, 1, 7, 5, 0]))
print(find_next_permutation([3, 4, 2, 5, 1]))
print(find_next_permutation([3, 2, 1]))