Next permutation problem

Given an array of number rearrange the given numbers into the lexicographic-ally next greater permutation of itself.

Example

Input:
1,2,3
3,2,1
1,1,5

Output:
1,3,2
1,2,3
1,5,1

Next Permutation

Next permutation solution in javascript

This problem is similar of finding the next greater element, we just have to make sure that it is greater lexicographic-ally.

Theoretically this is how the solution works.

  • Find the first index from the end where the value is less than the next value, if no such value exists then mark the index as -1.
  • Next find the next greater element from the rear before the first index.
  • Swap both the elements.
  • Reverse everything in the array before the first index that was found, if the index is -1 then whole array will be reversed.
  • Thus next permutation is formed.
const nextPermutation = (nums) => {
    let i, j;
    // Find the first index from the right where the value is less than the next value. If this doesn't exist then i = -1.
    for (i = nums.length - 2; nums[i] >= nums[i + 1] && i >= 0; i--);
    if (i >= 0) {
        // Find the first index from the right where the value is greater than the value found in previous step.
        for (j = nums.length - 1; nums[j] <= nums[i]; j--);
        // Swap the two values found.
        [nums[i], nums[j]] = [nums[j], nums[i]];
    }
    // Reverse everything after index i found above. Note if i = -1 then the whole array is reversed.
    for (i++, j = nums.length - 1; i < j; i++, j--) {
        [nums[i], nums[j]] = [nums[j], nums[i]];
    }
};
Input:
const arr = [1, 1, 5];
nextPermutation(arr);
console.log(arr);

Output:
[1, 5, 1]

Time complexity: O(n ^ 2).
Space complexity: O(1).