Next Permutation

MediumArrayTwo Pointers

Solution

export function nextPermutation(nums: number[]): void {
  const n = nums.length;
  const swap = (i: number, j: number) => {
    [nums[i], nums[j]] = [nums[j], nums[i]];
  };
  const reverse = (startIndex = 0) => {
    let [i, j] = [startIndex, n - 1];
    while (i < j) {
      swap(i, j);
      i += 1;
      j -= 1;
    }
  };
 
  let start = n - 2;
  while (0 <= start && nums[start + 1] <= nums[start]) {
    start -= 1;
  }
  if (start === -1) {
    return reverse();
  }
  let end = n - 1;
  while (nums[end] < nums[start]) {
    end -= 1;
  }
  swap(start, end);
  reverse(start + 1);
}