Permutations – Solution & Complexity

1. Recognize the Pattern

The key pattern is: Backtracking chooses each remaining value next. Identify the state and invariant before coding.

2. Build the Algorithm

Advance one state transition at a time. Mark or update state before exploring dependent work.

3. Check Edge Cases

Test empty or minimal input, skewed shapes, duplicates where allowed, and impossible outcomes.

4. Solution and Complexity

Time: O(nn!). Space: O(nn!).

def permute(nums: list[int]) -> list[list[int]]:
    answer = []
    def build(current, remaining):
        if not remaining:
            answer.append(current); return
        for i, value in enumerate(remaining):
            build(current + [value], remaining[:i] + remaining[i+1:])
    build([], nums)
    return answer

FAQ