Knowledge Guide
HomeDSACompany Practice

medium Next Permutation

Problem Statement

Given an array of integers nums, return the next permutation of nums.

A permutation of the array is an arrangement of its elements in the linear order or particular sequence.

A next permutation of the array is the next smallest lexicographically greater permutation of array elements.

If no higher permutation is possible, the array should be rearranged into its lowest possible order (ascending).

Examples

Try it yourself

Try solving this question here:

java
import java.util.Arrays; // Import statement for Arrays

public class Solution {

  public int[] nextPermutation(int[] nums) {
    // ToDo: Wrtie Your Code Here.
    return nums;
  }
}
✅ Solution Next Permutation

Problem Statement

Given an array of integers nums, return the next permutation of nums.

A permutation of the array is an arrangement of its elements in the linear order or particular sequence.

  • For example, permutations of the [2, 1, 3] array are [3,2,1], [3,1,2], [1,2,3], [1,3,2], [2, 1, 3], and [2, 3, 1].

A next permutation of the array is the next smallest lexicographically greater permutation of array elements.

  • For example, next permutation of [2, 1, 3] is [2, 3, 1], which is smallest lexicographically greater permutation.

If no higher permutation is possible, the array should be rearranged into its lowest possible order (ascending).

  • For example, next permutation for [3, 2, 1] is [1, 2, 3] as [3, 2, 1] doesn't have lexicographically larger permutation.

Examples

  • Example 1:

    • Input: [1, 3, 5, 4, 2]
    • Expected Output: [1, 4, 2, 3, 5]
    • Justification: The next permutation is obtained by swapping 3 with the next higher number (4) and then sorting the numbers after 4 in ascending order.
  • Example 2:

    • Input: [2, 3, 6, 5, 4, 1]
    • Expected Output: [2, 4, 1, 3, 5, 6]
    • Justification: The next permutation is found by swapping 3 with the next higher number (4) in the sequence following it and then sorting the numbers after 4 in ascending order.
  • Example 3:

    • Input: [1, 1, 5]
    • Expected Output: [1, 5, 1]
    • Justification: The next immediate permutation after [1, 1, 5] is [1, 5, 1].

Solution

To solve this problem, the key idea is to modify the sequence slightly to obtain the next greater arrangement of numbers. This approach can be visualized as follows: starting from the right end of the array, we look for the first pair of consecutive numbers where the left number is smaller than the right one. This left number is termed as the 'pivot'. The pivot is the number that we need to increase to get the next higher permutation. However, to ensure the smallest increase and maintain the order of a valid next permutation, we swap the pivot with the smallest number that is greater than it among the numbers to its right. After the swap, the sequence to the right of the original pivot position is reversed to ensure we get the lowest possible sequence there, completing the formation of the next permutation. This approach ensures we find the next permutation in an efficient and methodical way, without the need for generating all permutations.

This method is effective as it leverages the properties of permutations - an ordered arrangement of numbers. By making minimal changes - a single swap and a reversal, we move directly to the next sequence that is numerically just above the current one. This approach is efficient as it operates in linear time complexity, avoiding any unnecessary computations.

Step-by-step Algorithm

  1. Initialize Variables:

    • Let n be the length of the input array nums.
    • Initialize pivot to -1. The pivot variable will store the index of the pivot element we find.
  2. Find the Pivot:

    • Iterate backwards from the second last element (index n - 2) to the start of the array.
    • If an element nums[i] is found such that nums[i] < nums[i + 1], set pivot = i. Break the loop.
  3. Find the Successor (if Pivot is Found):

    • If pivot is not -1 (pivot exists), iterate backwards from the last element (index n - 1) to find the successor.
    • Find the smallest element nums[j] such that nums[j] > nums[pivot].
  4. Swap Pivot and Successor:

    • If a pivot was found (pivot != -1), swap the elements nums[pivot] and nums[j].
  5. Reverse the Sequence after Pivot Position:

    • Reverse the sub-array of nums starting from pivot + 1 to the end of the array.
    • This can be done by swapping elements symmetrically around the midpoint of the sub-array from pivot + 1 to n - 1.

Algorithm Walkthrough

  • Take the input [2, 3, 6, 5, 4, 1].
  • Find the pivot: The rightmost digit smaller than its right neighbor is 3 (since 3 is smaller than 6).
  • Find the successor: The smallest digit larger than 3 in the sequence to its right is 4.
  • Swap 3 and 4, the array becomes [2, 4, 6, 5, 3, 1].
  • Reverse the sequence after 4, which is [6, 5, 3, 1], to get [1, 3, 5, 6].
  • The array after reversal is [2, 4, 1, 3, 5, 6].
  • Final result is [2, 4, 1, 3, 5, 6].

Code

java

public class Solution {

  public int[] nextPermutation(int[] nums) {
    int n = nums.length, pivot = -1;

    // Step 1: Find the pivot
    for (int i = n - 2; i >= 0; i--) {
      if (nums[i] < nums[i + 1]) {
        pivot = i;
        break;
      }
    }

    if (pivot != -1) {
      // Step 2: Find the successor
      for (int j = n - 1; j > pivot; j--) {
        if (nums[j] > nums[pivot]) {
          // Step 3: Swap pivot and successor
          swap(nums, pivot, j);
          break;
        }
      }
    }

    // Step 4: Reverse the sequence after pivot position
    reverse(nums, pivot + 1);
    return nums;
  }

  private void swap(int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
  }

  private void reverse(int[] nums, int start) {
    int end = nums.length - 1;
    while (start < end) {
      swap(nums, start, end);
      start++;
      end--;
    }
  }

  public static void main(String[] args) {
    Solution solution = new Solution();

    // Example tests
    int[] nums1 = { 1, 3, 5, 4, 2 };
    System.out.println(
      "Next permutation: " + Arrays.toString(solution.nextPermutation(nums1))
    );

    int[] nums2 = { 2, 3, 6, 5, 4, 1 };
    System.out.println(
      "Next permutation: " + Arrays.toString(solution.nextPermutation(nums2))
    );

    int[] nums3 = { 1, 1, 5 };
    System.out.println(
      "Next permutation: " + Arrays.toString(solution.nextPermutation(nums3))
    );
  }
}

Complexity Analysis

  • Time Complexity: The algorithm runs in O(N) time, where N is the number of elements in the array. This efficiency is due to linear scans to find the pivot and successor, and a single reverse operation.
  • Space Complexity: O(1), as the rearrangement is done in-place with no need for extra space.
🤖 Don't fully get this? Learn it with Claude

Stuck on Next Permutation? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🪜 Hint ladder (no spoilers)

Progressively stronger hints — you still solve it.

I'm working on the problem **Next Permutation** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🎨 Explain the approach visually

See the technique, not just code.

Explain the optimal approach to **Next Permutation** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔍 Review my solution

Catch bugs, edge cases, sub-optimality.

I'll paste my solution to **Next Permutation**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔁 Drill the pattern

Lock in recognition with look-alikes.

Give me 2 problems that use the SAME underlying pattern as **Next Permutation**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes